푸시 Scalar
된 컨테이너가 보유한 값 이 푸시 후 영향을받는 시기와 이유를 이해하기가 어렵습니다 . 두 가지 양식화 된 예제에서보다 복잡한 컨텍스트에서 발생한 문제를 설명하려고합니다.
* 예 1 * 첫 번째 예에서 스칼라 $i
는 @b
a의 일부로 배열에 푸시 List
됩니다. 푸시 후 스칼라가 보유한 값은 $i++
명령어를 사용하여 for 루프의 이후 반복에서 명시 적으로 업데이트됩니다 . 이러한 업데이트는 배열의 값에 영향을 미칩니다 @b
. for 루프의 끝에서는 @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
되지 않습니다 . 즉, for 루프 후에도 여전히 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에서이 아닌가요?
edit : @timotimo의 의견 .WHERE
에 따라 예제에 출력을 포함 시켰습니다 . 이것은 (WHICH / 논리) 스칼라 ID가 $i
동일하게 유지되고 메모리 주소가 다양한 루프 반복을 통해 변경됨을 나타냅니다. 그러나 예제 2에서 푸시 된 스칼라가 왜 이전 주소 ( "448)와 결합하여 동일한 WHICH ID에 연결되어 있는지에 대해서는 설명하지 않습니다.
.WHERE
대신.WHICH
당신 스칼라 다른 객체가 루프 주위 때마다 실제로 볼 수 있습니다. 이는 뾰족한 블록이 "호출"되고 각 호출에서 서명이 "바운드"되기 때문에 발생합니다.