Tuple declaração de parâmetro e oddity atribuição
Pergunta
Eu posso atribuir um tuple da seguinte forma:
var (min, max) = (1, 2)
Mas eu não posso, em seguida, re-atribuir como segue
(min, max) = (1, 3) //compiler error: ';' expected but '=' found
Em vez disso, parecem ter a ver:
min = 1
max = 3
Por que o último trabalho enquanto a primeira não?
Solução
Bem, porque foi spec'ed dessa maneira, eu suponho.
Este, a atribuição de tupla, é um exemplo de correspondência padrão. correspondência de padrão acontece em três lugares que eu me lembre de:
var PATTERN = ... // or val
for (PATTERN <- ...) ...
case PATTERN => ...
Então, todos esses casos de trabalho:
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)
}
Agora, pegue o último exemplo, a um usando case
. Note-se que n
e c
nesse exemplo são não o mesmo n
e c
definido um pouco mais cedo. O jogo padrão irá atribuir valores a new identificadores n
e c
, que vai apagar a definição anterior para o ESCOPE da declaração case
. A mesma coisa aconteceu no exemplo for
, que não se alterou n
e c
previamente definido.
Agora, o que você quer que aconteça é para substituir o valor anterior, em vez de novos valores atribuir a novos identificadores. Isso não é como padrão trabalhos correspondentes, o que significa fazer isso acontecer implicaria uma regra totalmente nova. Desde Scala estimula delicadamente as pessoas para a imutabilidade, suponho que não é razoável que não criar uma nova regra apenas para lidar com isso.