J'ai du mal à comprendre quand et pourquoi la valeur détenue par un Scalarconteneur poussé est affectée après la poussée. Je vais essayer d'illustrer le problème que j'ai rencontré dans un contexte plus compliqué dans deux exemples stylisés.
* Exemple 1 * Dans le premier exemple, un scalaire $iest poussé sur un tableau @bdans le cadre de a List. Après le push, la valeur détenue par le scalaire est explicitement mise à jour dans les itérations ultérieures de la boucle for à l'aide de l' $i++instruction. Ces mises à jour ont un effet sur la valeur du tableau @b: à la fin de la boucle for, @b[0;0]est égal à 3et non plus 2.
my @b;
my $i=0;
for 1..3 -> $x {
$i++;
say 'Loose var $i: ', $i.VAR.WHICH, " ", $i.VAR.WHERE;
if $x == 2 {
@b.push(($i,1));
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
}
}
say "Post for-loop";
say "Array : ", @b;
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
Exemple de sortie 1:
Loose var $i: Scalar|94884317665520 139900170768608
Loose var $i: Scalar|94884317665520 139900170768648
Pushed $i : Scalar|94884317665520 139900170768648
Loose var $i: Scalar|94884317665520 139900170768688
Post for-loop
Array : [(3 1)]
Pushed $i : Scalar|94884317665520 139900170768688
* Exemple 2 * Dans le deuxième exemple, le scalaire $iest la variable de boucle. Même si $iest mis à jour après avoir été poussé (maintenant implicitement plutôt qu'explicitement), la valeur de $iin array @cne
change pas après la poussée; c'est-à-dire après la boucle for, ce n'est toujours 2pas le cas 3.
my @c;
for 1..3 -> $i {
say 'Loose var $i: ', $i.VAR.WHICH, " ", $i.VAR.WHERE;
if $i == 2 {
@c.push(($i,1));
say 'Pushed $i : ', @c[0;0].VAR.WHICH, " ", @c[0;0].VAR.WHERE;
}
}
say "Post for-loop";
say "Array : ", @c;
say 'Pushed $i : ', @c[0;0].VAR.WHICH, " ", @c[0;0].VAR.WHERE;;
Exemple de sortie 2:
Loose var $i: Scalar|94289037186864 139683885277408
Loose var $i: Scalar|94289037186864 139683885277448
Pushed $i : Scalar|94289037186864 139683885277448
Loose var $i: Scalar|94289037186864 139683885277488
Post for-loop
Array : [(2 1)]
Pushed $i : Scalar|94289037186864 139683885277448
Question: Pourquoi $idans @bl'exemple 1 mis à jour après la poussée, alors que $idans @cl'exemple 2 n'est pas?
edit : Suite au commentaire de @ timotimo, j'ai inclus la sortie de .WHEREdans les exemples. Cela montre que l'identité scalaire (WHICH / logique) $ireste la même, tandis que son adresse mémoire change à travers les différentes itérations de boucle. Mais cela n'explique pas pourquoi dans l'exemple 2 le scalaire poussé reste lié à la même identité QUI en combinaison avec une ancienne adresse ("448).
.WHEREplace de.WHICHvous pouvez voir que le scalaire est en fait un objet différent à chaque fois autour de la boucle. Cela se produit car les blocs pointus sont "appelés" et la signature est "liée" à chaque appel.