Scala - Đóng cửa
A closure là một hàm, có giá trị trả về phụ thuộc vào giá trị của một hoặc nhiều biến được khai báo bên ngoài hàm này.
Đoạn mã sau với chức năng ẩn danh.
val multiplier = (i:Int) => i * 10
Ở đây, biến duy nhất được sử dụng trong thân hàm, i * 10, là i, được định nghĩa như một tham số của hàm. Hãy thử đoạn mã sau -
val multiplier = (i:Int) => i * factor
Có hai biến tự do trong hệ số nhân: i và factor. Một trong số chúng, i, là một tham số chính thức của hàm. Do đó, nó bị ràng buộc với một giá trị mới mỗi khi số nhân được gọi. Tuy nhiên,factorkhông phải là một tham số chính thức, vậy đây là gì? Hãy để chúng tôi thêm một dòng mã nữa.
var factor = 3
val multiplier = (i:Int) => i * factor
Hiện nay factorcó một tham chiếu đến một biến bên ngoài hàm nhưng trong phạm vi bao quanh. Tham chiếu hàmfactorvà đọc giá trị hiện tại của nó mỗi lần. Nếu một hàm không có tham chiếu bên ngoài, thì nó sẽ bị đóng một cách đáng kể so với chính nó. Không cần bối cảnh bên ngoài.
Hãy thử chương trình ví dụ sau.
Thí dụ
object Demo {
def main(args: Array[String]) {
println( "multiplier(1) value = " + multiplier(1) )
println( "multiplier(2) value = " + multiplier(2) )
}
var factor = 3
val multiplier = (i:Int) => i * factor
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
multiplier(1) value = 3
multiplier(2) value = 6