Estoy leyendo el libro programming in Lua
. Dijo que
Los cierres proporcionan una herramienta valiosa en muchos contextos. Como hemos visto, son útiles como argumentos para funciones de orden superior como la ordenación. Los cierres son valiosos para funciones que también crean otras funciones, como nuestro ejemplo newCounter; Este mecanismo permite a los programas Lua incorporar técnicas sofisticadas de programación del mundo funcional. Los cierres también son útiles para las funciones de devolución de llamada. Un ejemplo típico aquí ocurre cuando crea botones en un kit de herramientas GUI convencional. Cada botón tiene una función de devolución de llamada que se llama cuando el usuario presiona el botón; desea que diferentes botones hagan cosas ligeramente diferentes cuando se presionan. Por ejemplo, una calculadora digital necesita diez botones similares, uno para cada dígito. Puede crear cada uno de ellos con una función como esta:
function digitButton (digit)
return Button{label = tostring(digit),
action = function ()
add_to_display(digit)
end}
end
Parece que si llamo al digitButton
, devolverá el action
(esto creará un cierre), por lo tanto, puedo acceder al digit
pasado digitButton
.
Mi pregunta es que:
Why we need call back functions? what situations can I apply this to?
El autor dijo:
En este ejemplo, suponemos que Button es una función del kit de herramientas que crea nuevos botones; etiqueta es la etiqueta del botón; y action es el cierre de devolución de llamada que se llamará cuando se presione el botón. La devolución de llamada se puede llamar mucho tiempo después de que digitButton realizó su tarea y después de que el dígito de la variable local se saliera del alcance, pero aún puede acceder a esta variable.
Según el autor, creo que un ejemplo similar es el siguiente:
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()
así, the callback can be called a long time after digitButton did its task and after the local variable digit went out of scope.