В Scala я могу передать повторные параметры другим методам? - PullRequest
29 голосов
/ 14 мая 2010

Вот что я могу сделать в Java, взять результаты повторного параметра и передать его другому методу:

public void foo(String ... args){bar(args);}
public void bar(String ... args){System.out.println("count="+args.length);}

В Scala это будет выглядеть так:

def foo(args:String*) = bar(args)
def bar(args:String*) = println("count="+args.length)

Но это не скомпилируется, подпись столбца ожидает серию отдельных строк, а переданные аргументы представляют собой нестроковую структуру.

Пока я просто обхожу массивы. Было бы очень хорошо использовать помеченные параметры. Есть ли способ сделать это?

1 Ответ

47 голосов
/ 14 мая 2010

Java предполагает, что вы хотите автоматически преобразовать массив args в varargs, но это может быть проблематично с методами, которые принимают varargs типа Object.

Scala требует, чтобы вы были явными, присваивая аргумент : _*.

scala> def bar(args:String*) = println("count="+args.length)
bar: (args: String*)Unit

scala> def foo(args:String*) = bar(args: _*)
foo: (args: String*)Unit

scala> foo("1", "2")
count=2

Вы можете использовать : _* для любого подтипа Seq или для любого, неявно преобразуемого в Seq, в частности Array.

scala> def foo(is: Int*) = is.length
foo: (is: Int*)Int

scala> foo(1, 2, 3)
res0: Int = 3

scala> foo(Seq(1, 2, 3): _*)
res1: Int = 3

scala> foo(List(1, 2, 3): _*)
res2: Int = 3

scala> foo(Array(1, 2, 3): _*)
res3: Int = 3

scala> import collection.JavaConversions._
import collection.JavaConversions._

scala> foo(java.util.Arrays.asList(1, 2, 3): _*)
res6: Int = 3

Это хорошо объяснено на примерах в справочнике по языку , в разделе 4.6.2.

Обратите внимание, что эти примеры сделаны с использованием Scala 2.8.0.RC2.

...