我可以按如下方式分配一个元组:
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
定义得早一点。模式匹配将为新标识符分配值 n
和 c
,这将影响 case
的范围的先前定义陈述。同样的事情发生在 for
上例如,没有改变 n
和 c
先前定义。现在,您想要发生的是覆盖以前的值,而不是为新标识符分配新值。这不是模式匹配的工作方式,这意味着实现它需要一个全新的规则。由于 Scala 温和地促使人们走向不变性,我认为他们没有创建新规则来处理这个问题并不是没有道理的。
关于syntax - 元组参数声明和赋值奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1624484/