¿Cómo llamar a una función que debe ser llamado desde arriba de su creación? He leído algo acerca de las declaraciones forward, pero Google no está siendo útil en este caso. ¿Cuál es la sintaxis correcta para esto?
¿Cómo llamar a una función que debe ser llamado desde arriba de su creación? He leído algo acerca de las declaraciones forward, pero Google no está siendo útil en este caso. ¿Cuál es la sintaxis correcta para esto?
Lua es un lenguaje dinámico y las funciones son un tipo de valor que puede ser llamado con el
()
operador. Así que usted realmente no necesita para adelante declarar la función tanto como asegurarse de que la variable de alcance cuando la llamada es la variable con la que usted piensa que es.Este no es un problema en absoluto para las variables globales que contienen funciones, ya que el medio ambiente global es el lugar predeterminado para buscar a resolver un nombre de variable. Para las funciones locales, sin embargo, usted necesita para asegurarse de que la variable local ya está en el ámbito en el léxico punto donde usted necesita llamar el valor que almacena, y también asegurarse de que en el tiempo de ejecución es realmente un valor que puede ser llamado.
Por ejemplo, aquí hay un par de condiciones mutuamente recursivas local funciones:
De curso, que es también un ejemplo del uso de la cola de llamadas para permitir la recursividad infinita que no hace nada, pero el punto aquí es el de las declaraciones. Al declarar las variables con
local
antes de que cualquiera tiene una función almacenada en él, esos nombres son conocidos por ser variables locales en el ámbito léxico de el resto de el ejemplo. A continuación, las dos funciones se almacenan, cada refiriéndose a la otra variable.Puede reenviar declarar una función por la que se declare su nombre antes de declarar el real cuerpo de la función:
Sin embargo declaraciones forward sólo son necesarios cuando se declaran las funciones con las de ámbito local. Que generalmente es lo que quieres hacer, pero Lua también soporta una sintaxis más parecido a C, en cuyo caso la declaración forward no es necesario:
local func1
es la declaración de una nuevo variable de ese nombre y deja la primerafunc1
huérfanos y aúnnil
.Pruebas bajo el incrustados lua en Freeswitch, adelante declaración no funciona:
resultado:
[ERR] mod_lua.cpp:203 /usr/local/freeswitch/scripts/foo.lua:1: intento de llamar a global ‘fmsg’ (un valor nil)
Invertir el orden no (duh) de trabajo.
Para comprender cómo la referencia adelantada en Lua trabaja en comparación con C, usted debe entender la diferencia fundamental entre C compilación y la Lua de ejecución.
En C, adelante de referencia es un tiempo de compilación mecanismo. Por lo tanto, si se incluyen una declaración forward plantilla en un módulo de C, entonces cualquiera de su código siguiente se empleará esta plantilla en la compilación de la llamada. Usted puede o no puede incluir la implementación de la función en el mismo módulo, en el que caso de que ambas declaraciones deben ser semánticamente idénticas o el compilador de error. Dado que este es un tiempo de compilación construir, el código compilado se puede ejecutar en cualquier orden.
En Lua, la referencia adelantada es tiempo de ejecución mecanismo, en el que el compilado función genera un prototipo de función interna dentro del código, pero esto sólo es accesible como un tiempo de ejecución de Lua variable o valor después de la ejecución se
transmiten a través de la declaración de la creación de un Lua cierre. Aquí el orden de declaración dentro de la fuente es inmaterial. Es el orden de ejecución que es importante: si el cierre no ha sido asociado a la variable, sin embargo, entonces la ejecución se lanzar un «valor nulo» excepción».
Si usted está utilizando una variable local para mantener el valor de la función, entonces normal de ámbito local todavía se aplican normas: la
local
declaración debe preceder su uso en la fuente y debe estar dentro del alcance, de lo contrario el compilador compila en el mal mundial o el exterior de la referencia local. Así que adelante de referencia utilizando los lugareños como se discutió en la otra respuesta va a trabajar, pero sólo si el Protos están vinculados a los cierres antes de la primera llamada se ejecuta.No me funciona si intento llamar a la función antes de la definición. Estoy usando este Lua script en nginx conf.
Fragmento de código –
Dado algunas otras respuestas también han señalado que no trabajo para ellos, es posible que se adelante la declaración de Lua no trabajar con otras herramientas.
PS : funciona bien si pongo la definición de la función antes y, a continuación, llamar después de las salas.
Si utiliza la programación orientada a objetos se puede llamar a cualquier función miembro antes de su «definición».
La salida del programa: