2010-08-18 1 views
10

Ho una funzione in questo modo:Come posso chiamare una funzione che richiede 2 parametri con una Tuple2?

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

Ho anche un Tuple2:

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

Quando chiamo di stampa con johnsmith ottengo il seguente errore:

scala> print(johnsmith)              

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

C'è in qualche modo intorno a questo? Posso arrivare a questo lavoro da incisione accettare un Tuple2:

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

Ora mi può chiamare in entrambi i casi:

scala> print2(johnsmith) 
John Smith 

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

C'è qualcosa che mi manca?

risposta

9

Prima convertire il metodo in una funzione, quindi convertire la funzione di due arg in una funzione di una tupla.

Function.tupled(print _)(johnsmith) 
10

Oltre a Dave's risposta, questo funziona anche:

(print _).tupled(johnsmith) 

Di solito, Function.tupled funziona meglio per funzioni anonime e chiusure in combinazione con map e metodi simili. Ad esempio:

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

In questo caso, il tipo per _ * _ è già definito da Function.tupled. Prova a utilizzare invece tupled e non funzionerà, perché la funzione viene definita prima che lo tupled lo converta.

Per il caso specifico, tupled funziona, poiché il tipo di print è già noto.