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