Tôi đang đọc cuốn sách programming in Lua
. Nó nói rằng
Đóng cửa cung cấp một công cụ có giá trị trong nhiều bối cảnh. Như chúng ta đã thấy, chúng hữu ích như các đối số cho các hàm bậc cao hơn như sắp xếp. Các bao đóng có giá trị đối với các hàm cũng xây dựng các hàm khác, như ví dụ newCorer của chúng tôi; cơ chế này cho phép các chương trình Lua kết hợp các kỹ thuật lập trình tinh vi từ thế giới chức năng. Đóng cửa cũng hữu ích cho các chức năng gọi lại. Một ví dụ điển hình ở đây xảy ra khi bạn tạo các nút trong bộ công cụ GUI thông thường. Mỗi nút có chức năng gọi lại được gọi khi người dùng nhấn nút; bạn muốn các nút khác nhau để làm những việc hơi khác nhau khi nhấn. Chẳng hạn, một máy tính kỹ thuật số cần mười nút tương tự, một nút cho mỗi chữ số. Bạn có thể tạo mỗi cái với một chức năng như thế này:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
Có vẻ như nếu tôi gọi digitButton
, nó sẽ trả về action
(điều này sẽ tạo ra một bao đóng), vì vậy, tôi có thể truy cập vào digit
thông qua digitButton
.
Câu hỏi của tôi là:
Why we need call back functions? what situations can I apply this to?
Tác giả cho biết:
Trong ví dụ này, chúng tôi giả định rằng Nút là một chức năng của bộ công cụ tạo ra các nút mới; nhãn là nhãn nút; và hành động là đóng cửa gọi lại được gọi khi nhấn nút. Cuộc gọi lại có thể được gọi một thời gian dài sau khi DigitButton thực hiện nhiệm vụ của mình và sau khi chữ số biến cục bộ đi ra khỏi phạm vi, nhưng nó vẫn có thể truy cập vào biến này.
Theo tác giả, tôi nghĩ một ví dụ tương tự như thế này:
function Button(t)
-- maybe you should set the button here
return t.action -- so that you can call this later
end
function add_to_display(digit)
print ("Display the button label: " .. tostring(digit))
end
function digitButton(digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
click_action = digitButton(10)
click_action()
do đó, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.