Avant de définir une fonction en Lua?
Comment dois-je appeler une fonction qui doit être appelée à partir de ci-dessus à sa création? J'ai lu quelque chose à propos de sa déclaration, mais Google n'est pas utile dans ce cas. Quelle est la bonne syntaxe pour cela?
Vous devez vous connecter pour publier un commentaire.
Lua est un langage dynamique et les fonctions sont juste une sorte de valeur qui peut être appelée avec le
()
de l'opérateur. Si vous n'avez pas vraiment besoin de le déclarer avant la fonction tant, assurez-vous que la variable dans la portée lorsque vous appelez c'est la variable que vous pensez.Ce n'est pas du tout un problème pour les variables globales, qui contient des fonctions, puisque l'environnement mondial est l'endroit par défaut de chercher à résoudre un nom de variable. Pour les fonctions locales, cependant, vous devez vous assurer que la variable locale est déjà dans la portée lexicale point où vous devez appeler la valeur des magasins, et aussi assurez-vous qu'au moment de l'exécution, c'est vraiment la tenue d'une valeur qui peut être appelé.
Par exemple, voici une paire de mutuellement récursives des fonctions locales:
Bien sûr, c'est aussi un exemple d'utilisation de la queue des appels afin de permettre une récursion infinie qui ne fait rien, mais le point ici est que dans les déclarations. Par déclarer les variables avec
local
avant soit a une fonction qui y sont stockées, ces noms sont connus pour être des variables locales dans le domaine lexical du reste de l'exemple. Alors que les deux fonctions sont stockées, chacun renvoyant à l'autre variable.Vous pouvez avant de déclarer une fonction, en indiquant son nom avant de déclarer la fonction réelle du corps:
Toutefois en avant les déclarations ne sont nécessaires que lors de la déclaration de fonctions avec une portée locale. C'est généralement ce que vous voulez faire, mais Lua prend également en charge une syntaxe plus comme C, auquel cas l'avant de la déclaration n'est pas nécessaire:
local func1
est la déclaration d'une nouvelles variable de ce nom et les feuilles de la premièrefunc1
orphelins et toujours à lanil
.Des contrôles dans le cadre intégré de lua dans Freeswitch, avant la déclaration ne fonctionne pas:
résultat:
[ERR] mod_lua.rpc:203 /usr/local/freeswitch/scripts/foo.lua:1: tentative d'appel global "fmsg' (a nil value)
L'inversion de l'ordre n' (duh) de travail.
À comprendre comment avant de référencement en Lua fonctionne par rapport à C, vous devez comprendre la différence fondamentale entre le C de la compilation et du Lua exécution.
En C, les contrats de référencement est un moment de la compilation mécanisme. Donc, si vous incluez l'une de l'avant modèle de déclaration dans un module C puis tout de votre code suivant va employer ce modèle dans la compilation de l'appel. Vous peut ou peut ne pas inclure la fonction de mise en œuvre dans le même module, dans ce cas, deux déclarations doivent être sémantiquement identique ou le compilateur générera une erreur. Puisque c'est un moment de la compilation, le construire, le code compilé peut être exécuté dans n'importe quel ordre.
En Lua, les contrats de référencement est runtime mécanisme, en ce que la fonction compilée génère un prototype de fonction à l'intérieur du code, mais ce n'est seulement accessible qu'à l'exécution, Lua variable ou la valeur après l'exécution a
passé au-dessus de la déclaration de la création d'un Lua fermeture. Ici, l'ordre de déclaration, à l'intérieur de la source est négligeable. C'est l'ordre d'exécution qui est important: si la fermeture n'a pas été lié à la variable encore, puis l'exécution sera lancer une "valeur nil" l'exception".
Si vous utilisez une variable locale pour stocker la valeur de la fonction, puis normal, local de portée des règles continuent de s'appliquer: la
local
déclaration doit précéder son utilisation dans la source et doit être dans la portée, sinon le compilateur compile dans le mauvais mondiale ou à l'extérieur de locaux de référence. Donc, avant de référencement à l'aide de la population locale comme discuté dans une autre réponse travail, mais seulement si les Protos sont liés à des fermetures avant le premier appel est exécuté.Ne fonctionne pas pour moi si j'essaie d'appeler la fonction avant de définition. J'utilise ce script Lua dans la conf nginx.
Extrait de Code -
Donné quelques autres réponses ont également souligné qu'il n'a pas de travail pour eux, il est possible qu'avant la déclaration de Lua ne fonctionne pas avec d'autres outils.
PS : Il fonctionne très bien si je mets la définition de la fonction avant et ensuite l'appeler après des salles.
Si vous utilisez de la programmation orientée objet, vous pouvez appeler n'importe quelle fonction membre avant sa "définition".
Programme de la sortie: