Saya mengalami kesulitan memahami kapan dan mengapa nilai yang dipegang oleh Scalarwadah terdorong dipengaruhi setelah dorongan. Saya akan mencoba mengilustrasikan masalah yang saya hadapi dalam konteks yang lebih rumit dalam dua contoh bergaya.
* Contoh 1 * Dalam contoh pertama, skalar $ididorong ke array @bsebagai bagian dari a List. Setelah push, nilai yang dimiliki oleh skalar secara eksplisit diperbarui dalam iterasi selanjutnya dari for loop menggunakan $i++instruksi. Pembaruan ini memiliki efek pada nilai dalam array @b: pada akhir loop for, @b[0;0]sama dengan 3, dan tidak lagi 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;
Contoh output 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
* Contoh 2 * Dalam contoh kedua, skalar $iadalah variabel loop. Meskipun $idiperbarui setelah telah mendorong (sekarang secara implisit bukan eksplisit), nilai $idalam array @ctidak tidak
berubah setelah push; yaitu setelah for loop, masih 2, tidak 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;;
Contoh output 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
Pertanyaan: Mengapa $idi @bdalam contoh 1 diperbarui setelah push, sementara $idi @cdalam contoh 2 tidak?
sunting : Mengikuti komentar @ timotimo, saya memasukkan output dari .WHEREdalam contoh. Ini menunjukkan skalar-identitas (WHICH / logis) $itetap sama, sementara alamat memorinya berubah melalui berbagai iterasi loop. Tetapi itu tidak menjelaskan mengapa dalam contoh 2 skalar yang didorong tetap terikat pada identitas WHICH yang sama dalam kombinasi dengan alamat lama ("448).
.WHEREalih-alih,.WHICHAnda dapat melihat bahwa skalar sebenarnya adalah objek yang berbeda setiap kali di loop. Itu terjadi karena blok runcing "disebut", dan tanda tangan "terikat" pada setiap panggilan.