2010-05-14 12 views
28

Aquí es algo que puedo hacer en Java, tomar los resultados de un parámetro repetido y pasarlo a otro método:¿En Scala puedo pasar parámetros repetidos a otros métodos?

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

en Scala se vería así:

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

Pero esto won 'compilar, la firma de la barra espera una serie de cadenas individuales, y las discusiones pasadas es una estructura no de cadena.

Por ahora solo estoy pasando arreglos. Sería muy bueno usar parámetros destacados. ¿Hay alguna forma de hacerlo?

Respuesta

46

Java supone que desea convertir automáticamente el Array args en varargs, pero esto puede ser problemático con métodos que aceptan varargs de tipo Object.

Scala requiere que sea explícito, al atribuir el argumento con : _*.

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 

Puede utilizar : _* en cualquier subtipo de Seq, o en cualquier cosa implícitamente convertible a un Seq, especialmente 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 

Se explica bien con ejemplos en la Language Reference, en la sección 4.6.2.

Tenga en cuenta que estos ejemplos están hechos con Scala 2.8.0.RC2.

+1

La referencia se mueve a http://www.scala-lang.org/docu/files/ScalaReference.pdf – pocorall

Cuestiones relacionadas