2010-08-18 10 views
10

J'ai une fonction comme ceci:Comment puis-je appeler une fonction qui prend 2 paramètres avec un Tuple2?

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

J'ai aussi un Tuple2:

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

Quand j'appelle impression avec johnsmith je reçois l'erreur suivante:

scala> print(johnsmith)              

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

est-il d'une certaine manière autour de cela? Je peux obtenir ce travail en faisant imprimer accepter un Tuple2:

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

Maintenant, je peux l'appeler ou l'autre manière:

scala> print2(johnsmith) 
John Smith 

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

Y at-il quelque chose que je suis absent?

Répondre

9

Convertissez d'abord la méthode en fonction, puis convertissez la fonction de deux arguments en une fonction d'un tuple.

Function.tupled(print _)(johnsmith) 
10

En plus de Dave's réponse, cela fonctionne aussi:

(print _).tupled(johnsmith) 

Habituellement, Function.tupled qui fonctionnera le mieux pour les fonctions et les fermetures anonymes en combinaison avec map et des méthodes similaires. Par exemple:

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

Dans ce cas, le type de _ * _ est déjà défini par Function.tupled. Essayez d'utiliser tupled pour cela et cela ne fonctionnera pas, car la fonction est définie avant que tupled ne le convertisse. Pour votre cas particulier, tupled fonctionne, car le type de print est déjà connu.