2011-11-30 18 views
5

Tengo una Option:Scala: ¿Puedo convertir una Opción en varargs?

val myOption: Option[Int] = fooBar() 

Y un método que toma un parámetro varargs:

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

¿Hay alguna manera de pasar la opción al método como un parámetro varargs? es decir, si la opción es Some(3), pase 3, y si es None, no pase nada.

Experimentando con la respuesta a scala: How to pass an expanded list as varargs into a method? He intentado escribir explícitamente el argumento:

myMethod("xyz", myOption: _*) 

pero el compilador se queja de que se requiere un Seq[Int]. Parece que Option no implementa Seq y no hay una conversión predefinida.

Dado que el compilador quiere un Seq, puedo, por supuesto, pasar myOption.toList: _*, pero ¿hay una manera más agradable?

+0

¿Qué requiere su método de un 'Seq'? Es posible que pueda escribirlo con operaciones de recopilación más generales (es decir, foreach, mapa, filtro, etc.) – schmmd

+0

@schmmd En este caso particular, 'myMethod' es parte de una biblioteca de terceros, por lo que no tengo más remedio que usar varargs. Si fuera mi propio código, probablemente solo reescribiera el método para tomar 'Iterable [Int]' en vez de 'Int *', ¡y salvarme de todo este problema! –

Respuesta

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

¿Estoy en lo cierto al pensar que esto llamará internamente a 'myOption.toList', a través del método' implicit def option2Iterable' del objeto 'Option'? –

+0

@ChrisB Ouch! Tienes toda la razón ... Sí, 'toList' es mejor. –

Cuestiones relacionadas