Mam trudności ze zrozumieniem, kiedy i dlaczego wartość trzymana przez przepchnięty Scalar
pojemnik 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 $i
jest wypychany na tablicę @b
jako 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 3
i 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 $i
jest zmienną pętli. Nawet jeśli $i
jest aktualizowana po to został zepchnięty (teraz domyślnie zamiast jawnie), wartość $i
w tablicy @c
ma nie
zmienia się po naciśnięciu; czyli po pętli, to jeszcze 2
nie 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 $i
w @b
w przykładzie 1 zaktualizowanej po naciśnięciu, podczas gdy $i
w @c
w przykładzie 2 nie jest?
edycja : Po komentarzu @ timotimo zamieściłem wynik .WHERE
w przykładach. Pokazuje to (KTÓRA / logiczna) tożsamość skalarna $i
pozostaje 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).
.WHERE
zamiast 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.