Я читаю книгу programming in Lua
. Це сказало це
Закриття є цінним інструментом у багатьох контекстах. Як ми бачили, вони корисні як аргументи до функцій вищого порядку, таких як сортування. Закриття є цінним для функцій, які також будують інші функції, як наш приклад 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?
Автор сказав:
У цьому прикладі ми припускаємо, що кнопка - це функція інструментарію, яка створює нові кнопки; label - мітка кнопки; і дія - це закриття зворотного дзвінка, яке потрібно викликати при натисканні кнопки. Зворотний виклик можна викликати довгий час після того, як 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.