Thời gian khởi tạo biến đổi cong vênh?


8

Trong vòng lặp đơn giản sau đây, chúng ta tạo một mảng (@a) bằng cách tăng một biến không chữ ($ n):

my @a = do for 1..3 {
    state $n;
    $n.^name, $n++;
}

say @a;

Kết quả là "loại" dự kiến:

[(Any 0) (Int 1) (Int 2)]

Và tôi nói "loại" bởi vì tôi đã dự đoán là giá trị đầu tiên của $ n giá trị "không xác định" (Bất kỳ).

Giống như, sau khi giá trị đầu tiên được tạo ra (Bất kỳ) và khi chúng ta tăng $ n (sau lần tăng đầu tiên của $ n, chúng ta sẽ truyền vào một Int), cũng có một sự kiện cong vênh thời gian trong bài tập và chúng ta cũng nhận được giá trị đầu tiên thay đổi. Vì vậy, chúng tôi cuối cùng có giá trị đầu tiên là 0 (không).

Ai đó có thể giải thích cơ chế chính xác của hành vi này?

Câu trả lời:


7

xem Any.pm6 # L519 , ứng cử viên

multi sub postfix:<++>(Mu:U $a is rw) { $a = 1; 0 }

Được sử dụng. Có một số ứng cử viên khác cho các giá trị không xác định, bạn có thể thử

my Bool $x; 
dd $x++; #Bool::False

my Num $y;
dd $y++; #0e0

1
Vì vậy, nếu tôi hiểu chính xác, việc "đẩy" ra mảng @a được thực hiện SAU hành động được ngụ ý bởi hàm postfix ++?
Jakar

1
Phải, tất nhiên. Tương tự như đối với ^name. Trong mảng, có các giá trị trả về của ^name++.
wamba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.