İtilen bir Scalar
konteyner 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 $i
bir @b
parç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 3
ve 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 $i
döngü değişkenidir. Olsa $i
da, (örtük yerine açıkça daha şimdi) değerini basıldıktan sonra güncellenir $i
dizisi içinde @c
yok değil
itme sonra değişmez; yani for döngüsünden sonra, hala 2
değ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 $i
içinde @b
iken, itme sonra güncellenir örnek 1'de $i
de @c
örnek 2'de değil mi?
edit : @ timotimo'nun yorumunu takiben .WHERE
, örneklerin çıktısını dahil ettim . Bu, $i
bellek 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).
.WHERE
bunun 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.