ฉันมีปัญหาในการทำความเข้าใจว่าเมื่อใดและเพราะเหตุใดค่าที่จัดขึ้นโดยScalarคอนเทนเนอร์ที่ถูกพุชได้รับผลกระทบหลังจากการพุช ฉันจะพยายามอธิบายปัญหาที่ฉันพบในบริบทที่ซับซ้อนมากขึ้นในตัวอย่างสองตัวอย่าง
* * * * * * * * ตัวอย่างที่ 1ในตัวอย่างแรกเป็นสเกลา$iถูกผลักลงบนอาร์เรย์เป็นส่วนหนึ่งของ@b Listหลังจากการพุชค่าที่เก็บโดยสเกลาร์จะได้รับการอัพเดตอย่างชัดเจนในการวนซ้ำในภายหลังของ for for loop โดยใช้$i++คำสั่ง การปรับปรุงเหล่านี้มีผลกระทบต่อค่าในอาร์เรย์@b: ในตอนท้ายของสำหรับวงที่@b[0;0]มีค่าเท่ากับและไม่มีอีกต่อไปเพื่อ32
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จะไม่เปลี่ยนแปลงหลังจากการพุช คือหลังจากที่สำหรับวงก็ยังคงไม่ได้23
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 สเกลาร์ที่ถูกผลักยังคงเชื่อมโยงกับเอกลักษณ์ WHICH- ตัวตนเดียวกันรวมกับที่อยู่เดิม ("448)
.WHEREแทนคุณ.WHICHจะเห็นว่าสเกลาร์เป็นวัตถุที่แตกต่างกันในแต่ละครั้งที่วนรอบ ที่เกิดขึ้นเพราะบล็อกแหลมเป็น "เรียกว่า" และลายเซ็นคือ "ผูกพัน" ในการโทรแต่ละครั้ง