2010-08-18 16 views
10

Tuple2 ile 2 parametre alan bir işlevi nasıl arayabilirim?

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

Ben de bir Tuple2 var:

val johnsmith = ("John", "Smith") 
Ben johnsmith ile yazdırmak aradığımda aşağıdaki hatayı alıyorum:

scala> print(johnsmith)              

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

Bazı var mı Bu şekilde mi? Bunu bir baskıyı kabul ederek çalıştırabilirim Tuple2:

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

Şimdi her iki şekilde de diyebilirim:

scala> print2(johnsmith) 
John Smith 

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

Eksik olduğum bir şey var mı?

cevap

9

İlk olarak yöntemi bir işleve dönüştürün ve sonra iki arj işlevini bir tuple ait bir işleve dönüştürün.

Function.tupled(print _)(johnsmith) 
10

Dave's yanıta ek olarak, bu çok çalışır:

(print _).tupled(johnsmith) 

Genellikle Function.tupled map ve benzeri yöntemlerle birlikte anonim fonksiyonları ve kapanışları için en iyi çalışır. Örneğin: Bu durumda

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

, _ * _ için türü zaten Function.tupled tarafından tanımlanır. Bunun yerine tupled kullanmayı deneyin ve çalışmaz, çünkü işlev tupled onu dönüştürmeden önce tanımlanmıştır.

Özel durumunuz için, print türünden beri tupled çalışır.

İlgili konular