2010-07-13 14 views
6

En Scala (2,7), si tengo esta función:¿Cómo envío argumentos repetidos en Scala?

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

Si ahora tratar de definir lo siguiente:

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

entonces el compilador se queja:

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

I no entiendo este error, ya que el libro Programming Scala indica que el tipo de args dentro de la función bar es realmente Array[String]. ¿Cómo se supone que debo escribir una función de envoltura de este tipo con argumentos repetidos?

+7

Si el libro en realidad equivale a Foo * Matriz [Foo] que está mal; la traducción habitual es Seq [Foo] –

Respuesta

18
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 

que debe realizar por encima de la conversión porque varargs en Scala se implementan como Seq, no Array.


aquí es cómo varargs están generalmente transmitió en 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 
+1

Me perdí completamente el problema la primera vez. Gracias. para hacer que las respuestas correctas floten! –

Cuestiones relacionadas