Я читаю книгу programming in Lua
. Он сказал, что
Закрытия предоставляют ценный инструмент во многих контекстах. Как мы уже видели, они полезны в качестве аргументов для функций высшего порядка, таких как sort. Замыкания полезны для функций, которые также создают другие функции, как, например, наш пример newCounter; Этот механизм позволяет программам Lua включать сложные методы программирования из функционального мира. Замыкания также полезны для функций обратного вызова. Типичный пример здесь происходит, когда вы создаете кнопки в обычном инструментарии GUI. Каждая кнопка имеет функцию обратного вызова, которая вызывается, когда пользователь нажимает кнопку; Вы хотите, чтобы разные кнопки делали немного разные вещи при нажатии. Например, цифровому калькулятору нужно десять одинаковых кнопок, по одной для каждой цифры. Вы можете создать каждый из них с помощью такой функции:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
Кажется, что если я вызову digitButton
, он вернет action
(это создаст замыкание), поэтому я могу получить доступ к digit
переданному digitButton
.
Мой вопрос таков:
Why we need call back functions? what situations can I apply this to?
Автор сказал:
В этом примере мы предполагаем, что Button является функцией инструментария, которая создает новые кнопки; метка - это метка кнопки; и action - это закрытие обратного вызова, которое вызывается при нажатии кнопки. Обратный вызов может быть вызван долгое время после того, как digitButton выполнил свою задачу и после того, как цифра локальной переменной вышла из области видимости, но он все еще может получить доступ к этой переменной.
по мнению автора, я думаю, что похожий пример выглядит так:
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()
Таким образом, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.