2010-05-14 11 views
28

Hier ist etwas, was ich in Java tun, die Ergebnisse einer wiederholten Parameter nehmen und es an eine andere Methode übergeben:Kann ich in scala wiederholte Parameter an andere Methoden übergeben?

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

In scala würde es so aussehen:

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

Aber das won Beim Kompilieren erwartet die Balkensignatur eine Reihe einzelner Strings, und die übergebenen Argumente sind eine Nicht-String-Struktur.

Für jetzt bin ich nur um Arrays herum. Es wäre sehr schön, markierte Parameter zu verwenden. Gibt es einen Weg, es zu tun?

Antwort

46

Java macht eine Annahme, dass Sie das Array args automatisch in varargs konvertieren möchten. Dies kann jedoch bei Methoden, die Varargs vom Typ Object akzeptieren, problematisch sein.

Scala erfordert, dass Sie explizit sein, indem Sie das Argument mit : _* zuschreiben.

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 

können Sie verwenden : _* auf jedem Subtyp von Seq, oder auf irgendetwas implizit konvertierbar zu einem Seq, insbesondere 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 

Es wird erklärt, auch mit Beispielen in den Language Reference, in Abschnitt 4.6.2.

Beachten Sie, dass diese Beispiele mit Scala 2.8.0.RC2 erstellt wurden.

+1

Die Referenz wird nach http://www.scala-lang.org/docu/files/ScalaReference.pdf verschoben – pocorall

Verwandte Themen