【发布时间】:2010-12-10 02:47:56
【问题描述】:
我可以如下分配一个元组:
var (min, max) = (1, 2)
但是我不能重新分配如下
(min, max) = (1, 3) //compiler error: ';' expected but '=' found
相反,我似乎不得不这样做:
min = 1
max = 3
为什么后者有效而前者无效?
【问题讨论】:
我可以如下分配一个元组:
var (min, max) = (1, 2)
但是我不能重新分配如下
(min, max) = (1, 3) //compiler error: ';' expected but '=' found
相反,我似乎不得不这样做:
min = 1
max = 3
为什么后者有效而前者无效?
【问题讨论】:
嗯,因为它是这样指定的,我想。
这个,元组赋值,是模式匹配的一个例子。模式匹配发生在我记得的三个地方:
var PATTERN = ... // or val
for (PATTERN <- ...) ...
case PATTERN => ...
所以所有这些情况都有效:
val l = List((1,'a'), (2,'b'), (3,'c'))
var (n, c) = l(0)
for ((n, c) <- l) println(n+": "+c)
l(1) match {
case (n, c) => println(n+": "+c)
}
现在,举最后一个例子,使用case 的例子。请注意,该示例中的n 和c不与之前定义的n 和c 相同。模式匹配会将值分配给 new 标识符 n 和 c,这将影响 case 语句的范围的先前定义。同样的事情发生在for 示例上,它并没有改变之前定义的n 和c。
现在,您想要覆盖以前的值,而不是为新标识符分配新值。这不是模式匹配的工作方式,这意味着实现它需要一个全新的规则。由于 Scala 温和地推动人们走向不变性,我认为他们没有创建新规则来解决这个问题并不是不合理的。
【讨论】: