2009-12-02 26 views
47

Dada una función que toma una cantidad variable de argumentos, p.Scala: pase Seq a funciones var-args

def foo(os: String*) = 
    println(os.toList) 

¿Cómo puedo pasar una secuencia de argumentos a la función? Me gustaría escribir:

val args = Seq("hi", "there") 
foo(args) 

Obviamente, esto no funciona.

+0

Vea también: http://stackoverflow.com/questions/1008783/using-varargs-from-scala –

Respuesta

93

foo(args:_*) hace el truco. En lugar de aplicar la secuencia como un único argumento, cada elemento de la secuencia se usará como argumento.

+3

hay un código de revisión amigable, menos propenso al dolor de cabeza a la función anterior '' 'args: _ *' ' – Richeek

+0

Una forma de proporcionar una API que lo haga transparente, es escribir una función de proxy llamada' foo', que realiza la conversión. De esa forma, su llamada original a 'foo' funcionaría sin que su código de usuario tenga que preocuparse por eso. Habiendo dicho eso, si 'foo' requería una colección como' Seq' en lugar de un tipo primitivo como 'String', la invarianza de las colecciones de scala obstaculizaría cualquier uso sensato de tu API. Como si las listas de argumentos variables y las colecciones de la biblioteca estándar no se hubieran diseñado para casos de uso mutuo más allá de vanilla. – matanster

+0

@Richeek Lamentablemente, no. – Malcolm

Cuestiones relacionadas