Как переслать повторяющиеся аргументы в Scala? - PullRequest
6 голосов
/ 14 июля 2010

В Scala (2.7), если у меня есть эта функция:

def foo(args: Array[String]) =
  for (arg <- args) println(arg)

Если я сейчас попытаюсь определить следующее:

def bar(args: String*) = foo(args)

, то компилятор пожалуется:

<console>:5: error: type mismatch;
 found   : String*
 required: Array[String]
       def bar(args: String*) = foo(args)
                                ^

Я не понимаю этой ошибки, поскольку книга Scala по программированию утверждает, что тип args внутри функции bar на самом деле Array[String].Как я должен написать такую ​​функцию-обертку с повторяющимися аргументами?

1 Ответ

18 голосов
/ 14 июля 2010
scala> def foo(args: Array[String]) = for(arg <- args) println(arg)
foo: (args: Array[String])Unit

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

scala> bar("hello", "world")
hello
world

Вам нужно выполнить приведенное выше преобразование, потому что varargs в Scala реализованы как Seq, а не Array.


Вот как varargs обычно передаются в Scala:

scala> def fooV(args: String*) = args foreach println
fooV: (args: String*)Unit

scala> def fooS(args: Seq[String]) = fooV(args: _*)
fooS: (args: Seq[String])Unit

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

scala> def barS(args: Seq[String]) = args foreach println
barS: (args: Seq[String])Unit

scala> def barV(args: String*) = barS(args)
barV: (args: String*)Unit

scala> def barV(args: String*) = barS(args.toSeq)
barV: (args: String*)Unit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...