Estou lendo o livro programming in Lua
. Disse que
Os fechamentos fornecem uma ferramenta valiosa em muitos contextos. Como vimos, eles são úteis como argumentos para funções de ordem superior, como ordenação. Os fechamentos são valiosos para funções que constroem outras funções também, como nosso exemplo newCounter; esse mecanismo permite que os programas Lua incorporem técnicas sofisticadas de programação do mundo funcional. Os fechamentos também são úteis para funções de retorno de chamada. Um exemplo típico aqui ocorre quando você cria botões em um kit de ferramentas da GUI convencional. Cada botão possui uma função de retorno de chamada a ser chamada quando o usuário pressiona o botão; você deseja que botões diferentes façam coisas ligeiramente diferentes quando pressionados. Por exemplo, uma calculadora digital precisa de dez botões semelhantes, um para cada dígito. Você pode criar cada um deles com uma função como esta:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
Parece que se eu chamar o digitButton
, ele retornará o action
(isso criará um fechamento), para que eu possa acessar o digit
passado para digitButton
.
Minha pergunta é:
Why we need call back functions? what situations can I apply this to?
O autor disse:
Neste exemplo, assumimos que Button é uma função do kit de ferramentas que cria novos botões; label é o rótulo do botão; e action é o fechamento do retorno de chamada a ser chamado quando o botão é pressionado. O retorno de chamada pode ser chamado muito tempo depois que o digitButton executou sua tarefa e depois que o dígito da variável local ficou fora do escopo, mas ainda pode acessar essa variável.
de acordo com o autor, acho que um exemplo semelhante é assim:
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()
portanto, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.