Một chức năng ẩn danh (và thực sự, bất kỳ chức năng nào) trong scala thực sự là một đối tượng (một thể hiện của Function*
). Khi nó được khởi tạo, việc bắt giữ các vals được thực hiện bằng cách sao chép các vals vào các trường bên trong của đối tượng hàm. Trong phần thân hàm (có nghĩa là, trong phương thức apply
của đối tượng hàm) quyền truy cập vào các vals bị bắt được thực hiện bằng cách truy cập các trường này.
Việc nắm bắt các vars là tương tự, ngoại trừ trình biên dịch phải thêm một mức độ bất định: giá trị var được truy cập thông qua một số chủ có thể ẩn ẩn (chỉ đơn giản là đối tượng có trường có thể thay đổi trỏ đến giá trị hiện tại của var) và đây là chủ sở hữu này được sao chép vào đối tượng hàm. Khi viết vào var (hoặc bằng mã cục bộ hoặc bởi đối tượng hàm), nó là trường của chủ sở hữu được viết. Cơ chế này đảm bảo rằng mã cục bộ và mã của hàm thao tác cùng một dữ liệu và cả hai đều nhìn thấy các sửa đổi của nhau.
Vì vậy, câu trả lời là một Vals bắt và một var bắt cả hai luôn sống trên heap (dù là trực tiếp như một lĩnh vực của đối tượng chức năng, hoặc như là một lĩnh vực của một số đối tượng wrapper)
Nguồn
2012-10-11 04:39:26
Tôi không thể nhìn thấy bất kỳ trường nào trong các trường này nếu tôi chạy 'javap -p Test $$ anonfun $ 1.class' (một hàm ẩn danh trong đối tượng' Test') - bất kỳ ý tưởng nào tại sao không? –
Thêm tùy chọn riêng tư để xem các trường riêng tư –
-p và -private giống nhau. Tôi đã đăng một ví dụ ở đây: http://pastebin.com/AkaR6zjM không hiển thị các trường riêng tư. –