İtilen bir Scalarkonteyner tarafından tutulan değerin itme sonrasında ne zaman ve neden etkilendiğini anlamakta güçlük çekiyorum . Daha karmaşık bir bağlamda karşılaştığım sorunu iki stilize örnekte göstermeye çalışacağım.
* Örnek 1 * İlk örnekte, bir skaler a'nın $ibir @bparçası olarak bir diziye itilir List. Zorlamadan sonra, skaler tarafından tutulan değer, $i++talimatı kullanarak for döngüsünün sonraki yinelemelerinde açıkça güncellenir . Bu güncellemeler dizideki değer üzerinde bir etkiye sahiptir @b: for döngüsünün sonunda @b[0;0], eşittir 3ve artık değil 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;
Çıktı örneği 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
* Örnek 2 * İkinci örnekte, skaler $idöngü değişkenidir. Olsa $ida, (örtük yerine açıkça daha şimdi) değerini basıldıktan sonra güncellenir $idizisi içinde @cyok değil
itme sonra değişmez; yani for döngüsünden sonra, hala 2değil 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;;
Çıktı örneği 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
Soru: Neden $iiçinde @biken, itme sonra güncellenir örnek 1'de $ide @cörnek 2'de değil mi?
edit : @ timotimo'nun yorumunu takiben .WHERE, örneklerin çıktısını dahil ettim . Bu, $ibellek adresi çeşitli döngü yinelemelerinde değişirken , (WHICH / mantıksal) skaler kimliğinin aynı kaldığını gösterir. Ancak, örnek 2'de itilen skalerin neden eski bir adresle birlikte aynı WHICH kimliğine bağlı kaldığını açıklamamaktadır ("448).
.WHEREbunun yerine kullanırsanız.WHICH, skalanın döngü etrafında her seferinde aslında farklı bir nesne olduğunu görebilirsiniz. Bunun nedeni, sivri blokların "çağrılması" ve her çağrıda imza "bağlanması" nedeniyle olur.