2011-06-12 11 views
9

Me pregunto cuál es la mejor manera de hacerlo.Invocar un método usando una tupla como la lista de parámetros

val foo = Some("a") 
val bar = Some(2) 

def baz(a: String, b: Int) = if((b % 2) == 0) Some(a+","+b) else None 

(x zip y) flatMap baz //does not compile of course 
(x zip y) flatMap { x => baz(x._1, x._2) } //ugly 

Supongo que Odersky et al. tener otro truco en la manga para reducir el ruido en este ejemplo.

Así que la pregunta es cómo luchar contra el desorden aquí asumiendo que no está permitido cambiar la implementación de baz (por ejemplo, def baz(a: (String Int))).

+0

+1 Sé que es una especie de duplicado, pero en el título es mucho mejor así que lo hará ser encontrado por más personas :) – fresskoma

Respuesta

17

Esta pregunta ya ha sido contestada aquí: scala tuple unpacking

En primer lugar, hacer foo a una función mediante la aplicación parcial, a continuación, llamar tupled con su lista de parámetros:

(foo _).tupled(myTuple) 
+1

¡Gracias! (x zip y) flatMap (baz _). tupled funciona como un amuleto. –

1

La forma más común para descomprimir limpiamente cualquier cosa es con patrones o for-comprehensions:

for ((a,b) <- (x zip y); c <- baz(a,b)) yield(c) 
Cuestiones relacionadas