Tôi gặp khó khăn khi hiểu và tại sao giá trị được giữ bởi một Scalar
container bị đẩy bị ảnh hưởng sau khi đẩy. Tôi sẽ cố gắng minh họa vấn đề mà tôi gặp phải trong một bối cảnh phức tạp hơn trong hai ví dụ cách điệu.
* Ví dụ 1 * Trong ví dụ đầu tiên, vô hướng $i
được đẩy lên một mảng @b
như là một phần của a List
. Sau khi đẩy, giá trị được giữ bởi vô hướng được cập nhật rõ ràng trong các lần lặp lại sau của vòng lặp for bằng cách sử dụng $i++
lệnh. Các cập nhật này có ảnh hưởng đến giá trị trong mảng @b
: ở cuối vòng lặp for, @b[0;0]
bằng 3
và không còn 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;
Ví dụ đầu ra 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
* Ví dụ 2 * Trong ví dụ thứ hai, vô hướng $i
là biến vòng lặp. Mặc dù $i
được cập nhật sau khi nó đã được đẩy (nay ngầm chứ không phải là rõ ràng), giá trị của $i
trong mảng @c
nào không
thay đổi sau khi đẩy; tức là sau vòng lặp for, nó vẫn còn 2
, không 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;;
Ví dụ đầu ra 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
Câu hỏi: Tại sao $i
ở @b
trong ví dụ 1 được cập nhật sau khi việc đẩy mạnh, trong khi $i
ở @c
trong ví dụ 2 không?
chỉnh sửa : Theo nhận xét của @ timotimo, tôi đã bao gồm đầu ra của .WHERE
các ví dụ. Điều này cho thấy nhận dạng vô hướng (WHICH / logic) $i
vẫn giữ nguyên, trong khi địa chỉ bộ nhớ của nó thay đổi thông qua các lần lặp khác nhau. Nhưng điều đó không giải thích được tại sao trong ví dụ 2, vô hướng đẩy vẫn được gắn với cùng một danh tính WHICH kết hợp với một địa chỉ cũ ("448).
.WHERE
thay vì.WHICH
bạn có thể thấy rằng vô hướng thực sự là một đối tượng khác nhau mỗi lần xung quanh vòng lặp. Điều đó xảy ra vì các khối nhọn được "gọi" và chữ ký bị "ràng buộc" trên mỗi cuộc gọi.