Closure là gì?
Thuộc phần Logic và luồng chương trình trong hành trình Lua của Coddy. Bài học 14 trên 54.
Bạn đã học rằng hàm (function) có thể được lưu trong biến, truyền làm đối số và được trả về từ các hàm khác. Bây giờ, mình sẽ cùng bạn tìm hiểu một trong những hệ quả mạnh mẽ nhất của điều này: closure.
Closure xảy ra khi một hàm lồng bên trong “ghi nhớ” các biến cục bộ từ hàm bao quanh nó, ngay cả sau khi hàm bên ngoài đó chạy xong. Ban đầu, điều này có thể nghe lạ: làm sao một biến vẫn tồn tại sau khi hàm tạo ra nó đã chạy xong?
Đây là một ví dụ đơn giản minh họa khái niệm này:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Đầu ra: 1
print(counter()) -- Đầu ra: 2
print(counter()) -- Đầu ra: 3Khi gọi createCounter(), hàm này tạo một biến cục bộ count rồi trả về một hàm ẩn danh. Thông thường, bạn sẽ nghĩ rằng count biến mất khi createCounter() chạy xong. Nhưng hàm được trả về vẫn truy cập được count. Hàm đó “bao đóng” biến này.
Mỗi lần bạn gọi counter(), hàm này truy cập và sửa đổi cùng một biến count đã được tạo khi createCounter() chạy lần đầu. Hàm bên trong mang theo môi trường của nó, giúp duy trì trạng thái giữa các lần gọi.
Thử thách
DễViết một hàm createMultiplier để tạo một hàm nhân với một hệ số cụ thể, rồi dùng ngay hàm đó để nhân một số đã cho.
Logic:
- Tạo một hàm lồng bên trong
createMultiplier, hàm này nhận một tham số số - Hàm lồng sẽ nhân tham số của nó với
factortừ hàm bên ngoài - Hàm lồng sẽ tạo thành một closure, ghi nhớ giá trị
factor - Gọi hàm nhân với tham số
numbervà trả về kết quả
Tham số:
factor(số): Giá trị dùng để nhânnumber(số): Số cần nhân
Giá trị trả về:
- Kết quả nhân
numbervớifactor(số)
Tự làm thử
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Dùng hàm (function) multiply bên dưới
endBài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
2Các hàm khác của thư viện table
table.concat()Tạo table và unpack()table.sort()Sắp xếp tùy chỉnh bằng hàmÔn tập: Bảng điểm cao5Dự án: Bộ máy trò chơi phiêu lưu bằng văn bản
Thiết lập dự án: Căn phòngLiên kết các phòng3Các khái niệm nâng cao về hàm
Trả về nhiều giá trịHàm nhận số lượng đối số linh hoạt (...)Hàm là giá trị hạng nhấtHàm ẩn danhClosure là gì?Ôn tập: bộ xử lý sự kiện đơn giảnTự luyện tập: Trình biên dịch Lua online