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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top