Ho difficoltà a capire quando e perché il valore detenuto da un Scalar
contenitore push viene influenzato dopo la spinta. Proverò a illustrare il problema che ho incontrato in un contesto più complicato in due esempi stilizzati.
* Esempio 1 * Nel primo esempio, uno scalare $i
viene inserito in un array @b
come parte di a List
. Dopo il push, il valore mantenuto dallo scalare viene esplicitamente aggiornato nelle successive iterazioni del ciclo for usando l' $i++
istruzione. Questi aggiornamenti hanno un effetto sul valore dell'array @b
: alla fine del ciclo for, @b[0;0]
è uguale 3
e non più a 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;
Esempio di output 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
* Esempio 2 * Nel secondo esempio, lo scalare $i
è la variabile loop. Anche se $i
viene aggiornato dopo che è stato spinto (ora implicitamente piuttosto che esplicitamente), il valore di $i
a matrice @c
non non
cambia dopo la spinta; cioè dopo il ciclo for, è ancora 2
, no 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;;
Esempio di output 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
Domanda: Perché è $i
in @b
nell'esempio 1 aggiornato dopo la spinta, mentre $i
in @c
nell'esempio 2 non è?
modifica : seguendo il commento di @ timotimo, ho incluso l'output di .WHERE
negli esempi. Ciò mostra che l'identità scalare (WHICH / logica) di $i
rimane invariata, mentre il suo indirizzo di memoria cambia attraverso le varie iterazioni del ciclo. Ma non spiega perché nell'esempio 2 lo scalare spinto rimanga legato alla stessa identità WHICH in combinazione con un vecchio indirizzo ("448).
.WHERE
invece di.WHICH
te puoi vedere che lo scalare è in realtà un oggetto diverso ogni volta intorno al ciclo. Ciò accade perché i blocchi appuntiti vengono "chiamati" e la firma viene "associata" ad ogni chiamata.