2011-06-01 61 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