2010-03-15 3 views
6

ВместоScala: как указать varargs как тип?

def foo(configuration: (String, String)*) 

Я хотел бы, чтобы иметь возможность написать:

type Configuration = (String, String)* 
def foo(configuration: Configuration) 

Основной случай использования, чтобы обеспечить легкий сигнатуру метода при переопределении в подклассах

UPDATE: Я могу приблизиться к

type Param = (String, String) 
def foo(configuration: Param*) 

Но есть ли способ сделать это лучше?

ответ

9

Нет, * допускается только в ParamType, то есть в качестве параметра для анонимной функции или метода.

4.6.2 Повторные Параметры Синтаксис: ParamType :: = Тип «» Последний параметр секции параметра значение может быть суффиксом «», например, (..., x: T *). Тип такого повторяющегося параметра внутри метода представляет собой последовательность типа scala.Seq [T]. Методы с неоднократного параметров T * принять переменное число аргументов типа T.

Составитель ошибка @ пример Eastsun находится в первой строке, а не второй. Это не должно быть разрешено:

scala> type VarArgs = (Any*) 
defined type alias VarArgs 

Я поднял bug.

Это аналогичное ограничение для параметров By-Name. В этом случае компилятор предотвращает создание типа псевдонима:

scala> type LazyString = (=> String) <console>:1: error: no by-name parameter type allowed here 
     type LazyString = (=> String) 

Ваша последняя попытка является стандартным способом, чтобы выразить это.

+0

Исправлено! https://lampsvn.epfl.ch/trac/scala/ticket/3180 – retronym

2

Я думаю, вы могли бы использовать

type Configuration = ((String, String)*) 
def foo(configuration: Configuration) 

Но это сбой компилятора (2.8.0.r21161-b20100314020123). Кажется, ошибка компилятора scala.

1

Вы могли бы определить его как

type Param = (String, String) 
type Configuration = Seq[Param] 

def foo(configuration : Configuration) 

пользователь построить Экземпляр НомерСтарта

foo(List("1"->"2")) 

, который не является оптимальным.

Смежные вопросы