2013-05-01 52 views
10

有沒有辦法在Scala中分解函數的輸入參數(akin to Clojure)?解構Scala中的輸入參數嗎?

所以,相反的

scala> def f(p: (Int, Int)) = p._1 
f: (p: (Int, Int))Int 

我想有這樣的(它不工作):

scala> def f((p1, p2): (Int, Int)) = p1 
+0

請求相同的Scala的問題跟蹤:https://issues.scala-lang.org/browse/SI-7909 – retronym 2013-10-12 21:07:21

回答

14

我猜在Scala中,你會使用模式匹配來實現相同的,例如像這樣:

val f: (Int, Int) => Int = { case (p1, p2) => p1 } 

,或等效:

def f(p: (Int, Int)) = p match { case(p1, p2) => p1 } 

如果類型可以推斷,該(Int, Int) => Int可以被丟棄:

List((1, 2), (3, 4)) map { case (p1, p2) => p1 } 
+2

我寧願避免使用模式匹配作爲一個過於詳細的解決方案。不過,如果沒有其他的慣用方法,我可以接受它。有一個嗎? – 2013-05-01 21:10:05

+1

不是我所知道的... – ValarDohaeris 2013-05-01 21:17:43

+2

@JacekLaskowski - 這是最好的你會得到。元組和方法參數沒有完全統一,這是您注意到的地方之一。然而,你可以使用'def f(p1:Int,p2:Int)= p1 + p2',然後使用'(f_)。tupled'來創建一個函數,該函數可以接收一個元組,即使'def'具有獨立的參數。 – 2013-05-01 22:03:52

0
def f(p: ((Int, Int), (Int, Int))) = p._1  > f: (p: ((Int, Int), (Int, Int)))(Int, Int) 
f((1,2), (3,4))        > res1: (Int, Int) = (1,2)