28

我可以按如下方式分配一个元组:

var (min, max) = (1, 2)

但我不能再重新分配如下

(min, max) = (1, 3) //compiler error: ';' expected but '=' found

相反,我似乎必须这样做:

min = 1
max = 3

为什么后者有效而前者无效?

4

1 回答 1

28

好吧,因为它是这样指定的,我想。

这就是元组赋值,是模式匹配的一个例子。模式匹配发生在我记得的三个地方:

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. 请注意,nc在那个例子中是一样的n,并且c定义得更早一点。模式匹配会将值分配给新的标识符nc,这将影响语句范围的先前定义case。同样的事情发生在这个for例子上,它没有改变n并且c之前定义过。

现在,您想要发生的是覆盖以前的值,而不是为新标识符分配新值。这不是模式匹配的工作方式,这意味着实现它需要一个全新的规则。由于 Scala 温和地促使人们走向不变性,我认为他们没有创建新规则只是为了处理这个问题并不是没有道理的。

于 2009-10-26T15:59:50.570 回答