2011-11-30 9 views
5

Ho un Option:Scala: posso convertire un'opzione in varargs?

val myOption: Option[Int] = fooBar() 

E un metodo che prende un param varargs:

def myMethod(a: String, b: Int*) = {...} 

C'è un modo per passare l'opzione al metodo come un param varargs? Ad esempio, se l'opzione è Some(3), passare 3 e se è None non inviare nulla.

Sperimentare con la risposta a scala: How to pass an expanded list as varargs into a method? Ho provato a digitare esplicitamente l'argomento:

myMethod("xyz", myOption: _*) 

ma il compilatore si lamenta che richiede un Seq[Int]. Sembra che Option non implementa Seq e non vi è alcuna conversione implicita di pre-conversione.

Dato che il compilatore vuole un Seq, posso ovviamente passare myOption.toList: _*, ma c'è un modo più bello?

+0

Che cosa richiede il metodo da un 'Seq'? È possibile che tu possa scriverlo con operazioni di raccolta più generali (es. Foreach, map, filter, ecc.) – schmmd

+0

@schmmd In questo caso particolare, 'myMethod' fa parte di una libreria di terze parti, quindi non ho altra scelta che usare varargs. Era il mio codice, probabilmente avrei semplicemente riscritto il metodo per prendere 'Iterable [Int]' invece di 'Int *', e mi sono risparmiato tutti questi problemi! –

risposta

5
myMethod("xyz", myOption.toSeq: _*) 
+1

Ho ragione nel pensare che questo chiamerà internamente 'myOption.toList', tramite il metodo' implicit def option2Iterable' dell'oggetto 'Option'? –

+0

@ChrisB Ahi! Hai assolutamente ragione ... Sì, 'tolist 'è migliore. –