Подтвердить что ты не робот

В scala могу ли я передавать повторяющиеся параметры другим методам?

Вот что я могу сделать в 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)

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

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

4b9b3361

Ответ 1

Java делает предположение, что вы хотите автоматически преобразовывать Array 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.