2010-08-18 55 views
10

我有一個功能,像這樣:如何調用一個帶有Tuple2參數的函數?

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

我也有一個Tuple2:

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

當我打電話打印與JohnSmith對我收到以下錯誤:

scala> print(johnsmith)              

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

有有人解決這個問題嗎?我能得到這個通過使打印接受Tuple2工作:

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

現在,我可以把它任何一種方式:

scala> print2(johnsmith) 
John Smith 

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

有我丟失的東西?

回答

9

首先將該方法轉換爲函數,然後將兩個參數的函數轉換爲一個元組的函數。

Function.tupled(print _)(johnsmith) 
10

除了Dave's答案,這個工程太:

(print _).tupled(johnsmith) 

通常,Function.tupled將工作最適合匿名函數和閉包結合map和類似的方法。例如:

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

在這種情況下,用於_ * _類型已經被定義Function.tupled。嘗試使用tupled代替它,它不起作用,因爲該功能是在tupled轉換它之前定義的。

對於您的特定情況,tupled有效,因爲print的類型已知。

相關問題