Question

Je peux attribuer un tuple comme suit:

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

Mais je ne peux pas alors réaffecter comme suit

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

Au lieu de cela, il me semble devoir faire:

min = 1
max = 3

Pourquoi ce dernier fonctionne-t-il alors que le premier ne fonctionne pas?

Était-ce utile?

La solution

Eh bien, parce que c'était spécifié de cette façon, je suppose.

Ceci, l’affectation de tuple, est un exemple de correspondance de modèle. La correspondance des motifs se produit à trois endroits dont je me souviens:

var PATTERN = ... // or val

for (PATTERN <- ...) ...

case PATTERN => ...

Donc, tous ces cas fonctionnent:

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)
}

Maintenant, prenons le dernier exemple, celui qui utilise case . Notez que n et c dans cet exemple sont pas le même n et c . défini un peu plus tôt. La correspondance de modèle attribuera des valeurs aux nouveaux identificateurs n et à c , qui occulteront la définition précédente de l'escope de la casse déclaration. La même chose s’est produite dans l’exemple pour , qui n'a pas changé les codes n et c définis précédemment.

Maintenant, vous voulez écraser la valeur précédente au lieu d’affecter de nouvelles valeurs à de nouveaux identificateurs. Ce n’est pas ainsi que l’appariement de modèles fonctionne, ce qui signifie que sa réalisation impliquerait une règle entièrement nouvelle. Puisque Scala pousse doucement les gens vers l’immutabilité, je suppose qu’il n’est pas déraisonnable de ne pas avoir créé une nouvelle règle juste pour gérer cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top