Mam trudności ze zrozumieniem, kiedy i dlaczego wartość trzymana przez przepchnięty Scalarpojemnik ma wpływ po wypchnięciu. Spróbuję zilustrować problem, na który wpadłem w bardziej skomplikowanym kontekście, w dwóch stylizowanych przykładach.
* Przykład 1 * W pierwszym przykładzie skalar $ijest wypychany na tablicę @bjako część List. Po wypchnięciu wartość przechowywana przez skalar jest wyraźnie aktualizowana w późniejszych iteracjach pętli for za pomocą $i++instrukcji. Te aktualizacje mają wpływ na wartość w tablicy @b: na końcu pętli for @b[0;0]jest równa 3i już nie 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;
Przykład wyjścia 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
* Przykład 2 * W drugim przykładzie skalar $ijest zmienną pętli. Nawet jeśli $ijest aktualizowana po to został zepchnięty (teraz domyślnie zamiast jawnie), wartość $iw tablicy @cma nie
zmienia się po naciśnięciu; czyli po pętli, to jeszcze 2nie 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;;
Przykład wyjścia 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
Pytanie: Dlaczego $iw @bw przykładzie 1 zaktualizowanej po naciśnięciu, podczas gdy $iw @cw przykładzie 2 nie jest?
edycja : Po komentarzu @ timotimo zamieściłem wynik .WHEREw przykładach. Pokazuje to (KTÓRA / logiczna) tożsamość skalarna $ipozostaje taka sama, podczas gdy jej adres pamięci zmienia się w różnych iteracjach pętli. Nie wyjaśnia to jednak, dlaczego w przykładzie 2 wypchnięty skalar pozostaje związany z tą samą tożsamością KTÓRĄ w połączeniu ze starym adresem („448).
.WHEREzamiast tego.WHICH, zobaczysz, że skalar jest w rzeczywistości innym obiektem za każdym razem wokół pętli. Dzieje się tak, ponieważ spiczaste bloki są „wywoływane”, a podpis jest „związany” przy każdym wywołaniu.