2010-05-14 9 views
28

Voici quelque chose que je peux faire en java, prendre les résultats d'un paramètre répété et passer à une autre méthode:En scala, puis-je transmettre des paramètres répétés à d'autres méthodes?

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

En scala il ressemblerait à ceci:

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

Mais ce won Lors de la compilation, la barre de signature attend une série de chaînes individuelles, et les arguments passés sont des structures non-chaîne.

Pour l'instant, je ne fais que passer des tableaux. Ce serait très agréable d'utiliser des paramètres étoilés. Y a-t-il un moyen de le faire?

Répondre

46

Java fait l'hypothèse que vous voulez convertir automatiquement le tableau args en varargs, mais cela peut être problématique avec les méthodes qui acceptent varargs de type Object. Scala requiert que vous soyez explicite, en attribuant l'argument à : _*.

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 

Vous pouvez utiliser : _* sur un sous-type de Seq, ou sur quoi que ce soit implicitement à un convertable Seq, notamment 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 

Il est bien expliqué avec des exemples dans le Language Reference, dans la section 4.6.2.

Notez que ces exemples sont faits avec Scala 2.8.0.RC2.

+1

La référence est déplacée à http://www.scala-lang.org/docu/files/ScalaReference.pdf – pocorall