Scala: как указать varargs как тип? - PullRequest
6 голосов
/ 15 марта 2010

вместо

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

Я бы хотел написать:

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 15 марта 2010

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

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

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

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

Я поднял ошибку .

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

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

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

2 голосов
/ 15 марта 2010

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

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

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

1 голос
/ 15 марта 2010

Вы можете определить это как

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

def foo(configuration : Configuration)

пользователь должен создать экземпляр Seq

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

что не оптимально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...