2010-07-13 6 views
6

Scala (2.7), si j'ai cette fonction:Comment transférer des arguments répétés dans Scala?

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

Si j'essaie maintenant de définir les éléments suivants:

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

le compilateur se plaint:

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

I ne comprends pas cette erreur, puisque le livre Scala de programmation indique que le type de args à l'intérieur de la fonction bar est actuellement Array[String]. Comment suis-je supposé écrire une telle fonction wrapper avec des arguments répétés?

+7

Si le livre équivaut effectivement Foo * à ce tableau est faux [Foo]; la traduction habituelle est Seq [Foo] –

Répondre

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 

Vous devez effectuer la conversion ci-dessus parce varargs à Scala sont mises en œuvre Seq, non Array.


Voici comment varargs sont généralement transmis à 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

J'ai complètement raté le problème la première fois. Merci beaucoup. pour faire les bonnes réponses flottent! –

Questions connexes