Một trong những điều đầu tiên tôi cố gắng học bằng ngôn ngữ lập trình không quen thuộc là cách nó xử lý các bao đóng. Ngữ nghĩa của chúng thường gắn bó với cách ngôn ngữ xử lý các phạm vi và các bit phức tạp khác để hiểu chúng cho thấy một số khía cạnh khác của ngôn ngữ. Plus, đóng cửa là một cấu trúc thực sự mạnh mẽ và thường xuyên cắt giảm số lượng boilerplate tôi phải gõ. Vì vậy, tôi đã rối tung xung quanh với đóng cửa perl và tôi stumbled khi một Gotcha nhỏ:
my @closures;
foreach (1..3) {
# create some closures
push @closures, sub { say "I will remember $_"; };
}
foreach (@closures) {
# call the closures to see what they remember
# the result is not obvious
&{$_}();
}
Khi tôi viết đoạn mã trên tôi đã mong đợi để xem
I will remember 1
I will remember 2
I will remember 3
nhưng thay vào đó tôi đã I will remember CODE(0x986c1f0)
.
Thử nghiệm trên cho thấy rằng $_
phụ thuộc rất bối cảnh và nếu nó xuất hiện trong một đóng cửa thì giá trị của nó không được cố định tại thời điểm tạo kết thúc. Nó hoạt động giống như một tham chiếu. Những gì gotchas khác tôi nên biết khi tạo bao đóng trong perl?
Nhưng điều này khá giống với việc sử dụng 'foreach $ num ...' của tôi. – davidk01
Vì vậy, nếu chúng chỉ đóng các biến từ vựng, điều gì xảy ra với các loại biến khác? Việc đóng cửa có sử dụng giá trị có sẵn trong trang web cuộc gọi như nó không cho '$ _'? – davidk01
@ davidk01: giống như bất kỳ ngôn ngữ lập trình nào khác cho phép các biến toàn cục, các bao đóng thực sự đóng trên biến đó như bình thường. Bạn chỉ cần quên rằng nó toàn cục và do đó có thể thay đổi khi mã khác đặt giá trị của nó thành một cái gì đó khác (giống như bởi chính tiểu trình ẩn danh khi nó được gọi). – slebetman