У мене є труднощі зрозуміти, коли і чому 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 не є?
редагувати : Після коментаря @ timotimo я включив висновок .WHERE
у приклади. Це показує (ЯКА / логічна) скалярна ідентичність $i
залишається однаковою, в той час як її пам'ять змінюється через різні ітерації циклу. Але це не пояснює, чому в прикладі 2 висунутий скаляр залишається прив’язаним до тієї ж, ЯКА Ідентичність у поєднанні зі старою адресою ("448).
.WHERE
замість.WHICH
вас, ви можете бачити, що скаляр насправді є різним об'єктом кожного разу навколо циклу. Це відбувається тому, що точкові блоки "викликаються", а підпис "прив'язується" до кожного дзвінка.