元组参数声明和分配怪胎(Tuple parameter declaration and assign

2019-09-01 06:12发布

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

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

但我不能再重新分配如下

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

相反,我似乎有做:

min = 1
max = 3

为什么后面的工作,而前者没有?

Answer 1:

好了,因为它是spec'ed这种方式,我想。

此,元组分配,是模式匹配的一个例子。 模式匹配发生在我回忆的三个地方:

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在那个例子是一样的nc定义早一些。 模式匹配将值分配给新的标识符nc ,这将影子以前的定义为的escope case声明。 同样的事情发生在for例子,这并没有改变nc先前定义。

现在,要发生什么是覆盖以前的值,而不是分配新值,新的标识符。 这不是怎样的模式匹配工作,这意味着促成这件事情将带来一个全新的规则。 由于斯卡拉轻轻电棒人民走向永恒,我想这是没有道理的,他们并没有创造一个新的规则只是为了处理这个问题。



文章来源: Tuple parameter declaration and assignment oddity