2009-12-02 11 views
47

Data una funzione che accetta un numero variabile di argomenti, ad es.Scala: passare alla Seq alle funzioni var-args

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

Come posso passare una sequenza di argomenti alla funzione? Vorrei scrivere:

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

Ovviamente, questo non funziona.

+0

Vedere anche: http://stackoverflow.com/questions/1008783/using-varargs-from-scala –

risposta

93

foo(args:_*) fa il trucco. Invece di applicare la sequenza come un singolo argomento, ciascun elemento della sequenza verrà utilizzato come argomento.

+3

c'è un codice adatto per la revisione del codice, meno mal di testa alla funzione precedente '' 'args: _ *' '' – Richeek

+0

Un modo per fornire un'API che rende questo trasparente, è scrivere una funzione proxy stessa denominata 'pippo', che effettua la conversione. In questo modo la tua chiamata originale a "pippo" funzionerebbe senza che il tuo codice utente debba preoccuparsi di ciò. Detto questo, se 'foo' richiedeva una raccolta come un' Seq' piuttosto che un tipo primitivo come 'String', l'invarianza delle collezioni di scala avrebbe ostacolato qualsiasi uso sano della tua api. Come se gli elenchi di argomenti variabili e le raccolte di librerie standard non siano state progettate per casi di uso reciproco oltre vanilla. – matanster

+0

@Richeek Sfortunatamente, no. – Malcolm