2010-08-18 7 views
10

Tôi có một chức năng như vậy:Làm cách nào để gọi hàm có 2 thông số bằng Tuple2?

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

Tôi cũng có một Tuple2:

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

Khi tôi gọi in với JohnSmith tôi nhận được lỗi sau:

scala> print(johnsmith)              

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

Có một số cách xung quanh điều này? Tôi có thể có được điều này để làm việc bằng cách in chấp nhận một Tuple2:

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

Bây giờ tôi có thể gọi nó là một trong hai cách:

scala> print2(johnsmith) 
John Smith 

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

Có cái gì tôi đang thiếu?

Trả lời

9

Đầu tiên chuyển đổi phương thức thành hàm, sau đó chuyển đổi hàm của hai arg thành hàm của một bộ.

Function.tupled(print _)(johnsmith) 
10

Ngoài Dave's câu trả lời, công trình này quá:

(print _).tupled(johnsmith) 

Thông thường, Function.tupled sẽ làm việc tốt nhất cho các chức năng ẩn danh và đóng cửa kết hợp với map và phương pháp tương tự. Ví dụ:

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

Trong trường hợp này, loại cho _ * _ đã được xác định bởi Function.tupled. Hãy thử sử dụng tupled cho điều đó thay vào đó và nó sẽ không hoạt động, bởi vì hàm được xác định trước khi tupled chuyển đổi nó.

Đối với trường hợp cụ thể của bạn, tupled hoạt động, vì loại print đã được biết.