Мне трудно понять, когда и почему значение, сохраняемое помещаемым 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вы можете видеть, что скаляр на самом деле каждый раз повторяет цикл. Это происходит потому, что заостренные блоки «вызываются», а подпись «привязывается» к каждому вызову.