Как Scala может получить несколько параметров в определении метода? - PullRequest
30 голосов
/ 17 сентября 2009

Java имеет:

public void someMethod(int ... intArray) { // question: what is the equivalent to "..." 
    // do something with intArray
}

как мне добиться такой же функциональности в Scala? То есть, передавать неопределенное количество параметров в метод?

Ответы [ 2 ]

49 голосов
/ 17 сентября 2009

В Java и Scala есть varargs, и оба поддерживают его только для последних параметров.

 def varargTest(ints:Int*) { ints.foreach(println) }  

Из этой статьи , разница заключается в типе, используемом для аргументов varargs:

  • массив для Java
  • Seq (последовательность) для Scala: его можно повторять, и доступно множество методов, таких как коллекции foreach, map, filter, find, ...

'*' обозначает 0 или более аргументов.

Примечание: если значения параметров уже «упакованы» в виде последовательности, такой как список, произойдет сбой:

# varargTest(List(1,2,3,4,5))  
# //--> error: type mismatch;  
# //-->  found   : List[Int]  
# //-->  required: Int  
# //-->        varargTest(List(1,2,3,4,5))  
# //--> 

Но это пройдет:

  varargTest(List(1,2,3):_*)  
  //--> 1  
  //--> 2  
  //--> 3  

'_' является ярлыком-заполнителем для вывода типа.«_*» здесь применяется к «повторному типу».
Раздел 4.6.2 из Спецификация Scala упоминает:

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

 (T1, . . . , Tn,S*)U => (T1, . . . , Tn,S, . . . , S)U, 

Единственное исключение из этого правила - если последний аргумент помечен как аргумент последовательности с помощью аннотации типа _*.

 (e1, . . . , en,e0: _*) => (T1, . . . , Tn, scala.Seq[S]).

Примечание bis: остерегайтесь стирания базового типа Java:

//--> error: double definition:
//--> method varargTest:(ints: Seq[Int])Unit and
//--> method varargTest:(ints: Int*)Unit at line 10
//--> have same type after erasure: (ints: Sequence)Unit
//-->   def varargTest(ints:Seq[Int]) { varargTest(ints: _*) }
43 голосов
/ 17 сентября 2009
def someMethod(values : Int*)

Дает массив. Поместите параметр аргумента переменной в качестве последнего формального параметра.

...