2009-10-26 5 views
25

je peux assigner un tuple comme suit:déclaration de paramètre Tuple et l'affectation bizarrerie

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

Mais je ne puis réattribuer comme suit

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

Au lieu de cela me semble avoir à faire:

min = 1 
max = 3 

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

Répondre

26

Eh bien, parce que c'était comme ça, je suppose.

Ceci, l'affectation d'un tuple, est un exemple de correspondance de modèle. La correspondance de motifs qui se passe dans trois endroits que je me souviens de:

var PATTERN = ... // or val 

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

case PATTERN => ... 

Donc tous ces cas, les travaux:

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, prenez 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 à nouveaux identificateurs n et c, qui fera l'ombre de la définition précédente pour l'escope de l'instruction case. La même chose s'est produite sur l'exemple for, qui n'a pas changé n et c précédemment défini. Maintenant, ce que vous voulez arriver est d'écraser la valeur précédente, au lieu d'assigner de nouvelles valeurs à de nouveaux identifiants. Ce n'est pas ainsi que fonctionne la mise en correspondance des modèles, ce qui signifie que la création d'un modèle entraînerait une règle entièrement nouvelle. Puisque Scala pousse doucement les gens vers l'immuabilité, je suppose que ce n'est pas déraisonnable qu'ils n'aient pas créé une nouvelle règle juste pour gérer ça.

+1

le ticket est https://issues.scala-lang.org/browse/SI-1324 ("il faudra un SIP") –