2010-08-18 11 views
10

que tienen una función de este modo:¿Cómo puedo llamar a una función que toma 2 parámetros con un Tuple2?

def print(name:String, surname:String) { println(name + " " + surname) } 

También tengo una Tuple2:

val johnsmith = ("John", "Smith") 

Cuando llamo de impresión con johnsmith me sale el siguiente error:

scala> print(johnsmith)              

error: not enough arguments for method print: (name: String,surname: String)Unit. 
Unspecified value parameter surname. 
     print(johnsmith) 
      ^

¿Hay alguna manera alrededor de esto? Puedo conseguir que esto funcione al hacer aceptar una impresión Tuple2:

def print2(t:Tuple2[String,String]) { println(t._1 + " " + t._2) } 

Ahora puede llamar de cualquier manera:

scala> print2(johnsmith) 
John Smith 

scala> print2("john", "smith") 
john smith 

¿Hay algo que me falta?

Respuesta

9

Primero convierta el método en una función, y luego convierta la función de dos args en una función de una tupla.

Function.tupled(print _)(johnsmith) 
10

Además de Dave's respuesta, esto también funciona:

(print _).tupled(johnsmith) 

Por lo general, Function.tupled funciona mejor para funciones anónimas y cierres en combinación con map y métodos similares. Por ejemplo:

List("abc", "def", "ghi").zipWithIndex.map(Function.tupled(_ * _)) 

En este caso, el tipo de _ * _ ya está definido por Function.tupled. Intente usar tupled para eso y no funcionará, porque la función se define antes de que tupled la convierta.

Para su caso particular, tupled funciona, ya que el tipo de print ya es conocido.

Cuestiones relacionadas