2011-06-01 140 views

回答

46

這不是簡單的「多變量賦值」,它是全功能模式匹配!

所以下面都是有效的:

val (a, b) = (1, 2) 
val Array(a, b) = Array(1, 2) 
val h :: t = List(1, 2) 
val List(a, Some(b)) = List(1, Option(2)) 

這是模式匹配的作品,它會去構建的東西分成更小的部分,這些部分綁定到新名稱的方式。按照規定,模式匹配不會綁定到已有的引用,你必須自己做。

var x: Int = _ 
var y: Int = _ 

val (a, b) = (1, 2) 
x = a 
y = b 

// or 

(1,2) match { 
    case (a,b) => x = a; y = b 
    case _ => 
} 
3

我不認爲你想要什麼是可能的,但你可以得到與「神奇」更新方法非常相似的東西。

case class P(var x:Int, var y:Int) { 
    def update(xy:(Int, Int)) { 
    x = xy._1 
    y = xy._2 
    } 
} 

val p = P(1,2) 
p() = (3,4) 
+5

omg,我應該明白這一點嗎?只是做一個變量賦值? – ziggystar 2011-06-01 07:08:44

+0

和一個可變成員的案例類?這個可以嗎? – ziggystar 2011-06-01 07:10:19

+0

它是完全有效的,即使它有點代碼味道 – 2011-06-01 07:32:49