Vâng ... nếu bạn muốn là kỹ thuật, đây là một hàm được dịch khi chạy vào thời điểm đóng, đóng các thuật ngữ mở (ràng buộc chúng thành một val/var trong phạm vi của hàm theo nghĩa đen). Ngoài ra, trong ngữ cảnh của hàm này theo nghĩa đen (_.sales >= threshold
), threshold
là một biến số miễn phí, vì chính hàm theo nghĩa đen không mang ý nghĩa gì. Chính nó, _.sales >= threshold
là thuật ngữ mở Khi chạy, nó được liên kết với biến cục bộ của hàm, mỗi lần hàm được gọi.
Đi chức năng này ví dụ, tạo ra đóng cửa:
def makeIncrementer(inc: Int): (Int => Int) = (x: Int) => x + inc
Khi chạy, các mã sau đây tạo ra 3 đóng cửa. Nó cũng thú vị để lưu ý rằng b và c không phải là cùng một đóng cửa (b == c
cho false
).
val a = makeIncrementer(10)
val b = makeIncrementer(20)
val c = makeIncrementer(20)
Tôi vẫn nghĩ rằng ví dụ được đưa ra trên wikipedia là một ví dụ tốt, mặc dù không hoàn toàn bao gồm toàn bộ câu chuyện. Nó khá khó khăn cho một ví dụ về đóng cửa thực tế theo định nghĩa chặt chẽ nhất mà không thực sự là một kết xuất bộ nhớ của một chương trình đang chạy. Nó giống với quan hệ lớp-đối tượng. Bạn thường đưa ra một ví dụ về một đối tượng bằng cách định nghĩa một số class Foo { ...
và sau đó khởi tạo nó với val f = new Foo
, nói rằng f là đối tượng.
-- Flaviu Cipcigan
Ghi chú:
- tham khảo: Lập trình tại Scala, Martin Odersky, Lex Spoon, Bill Venners
- Mã biên soạn với Scala phiên bản 2.7.5.final chạy trên Java 1.6.0_14 .
Nguồn
2009-08-16 13:01:13
Tại sao ngưỡng là một thuật ngữ đóng? Đó là một biến cục bộ được hàm bắt giữ khi nó được chuyển tới phương thức lọc, không? – skaffman
bạn nói đúng. ngưỡng không phải là một thuật ngữ khép kín, biến miễn phí của nó và việc đóng cửa là một thuật ngữ mở. – Schildmeijer