Мне трудно понять, когда и почему значение, сохраняемое помещаемым Scalar
контейнером, изменяется после отправки. Я попытаюсь проиллюстрировать проблему, с которой я столкнулся, в более сложном контексте на двух стилизованных примерах.
* Пример 1 * В первом примере скаляр $i
помещается в массив @b
как часть a List
. После отправки значение, хранящееся в скаляре, явно обновляется в последующих итерациях цикла for с использованием $i++
инструкции. Эти обновления влияют на значение в массиве @b
: в конце цикла for @b[0;0]
равно 3
и больше не равно 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;
Выходной пример 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
* Пример 2 * Во втором примере скаляр $i
является переменной цикла. Несмотря на то, $i
обновляется после того , как была нажата (теперь неявно , а не в явном виде), значение $i
в массиве @c
никак не
изменится после толчка; то есть после цикла for это все еще 2
не 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;;
Выходной пример 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
Вопрос: Почему $i
в @b
в примере 1 , обновленный после толчка, в то время как $i
в @c
в примере 2 не является?
edit : После комментария @ timotimo я включил вывод .WHERE
в примерах. Это показывает (WHICH / логическое) скалярное тождество $i
остается тем же самым, в то время как его адрес памяти изменяется через различные итерации цикла. Но это не объясняет, почему в примере 2 выдвинутый скаляр остается привязанным к той же WHICH-идентичности в сочетании со старым адресом («448»).
.WHERE
вместо,.WHICH
вы можете видеть, что скаляр на самом деле каждый раз повторяет цикл. Это происходит потому, что заостренные блоки «вызываются», а подпись «привязывается» к каждому вызову.