Question

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?

Était-ce utile?

La solution

Lua est un langage dynamique et les fonctions sont juste une sorte de valeur qui peut être appelé avec l' () 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à portée à l'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:

local a,b
a = function() return b() end
b = function() return a() end

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.

Autres conseils

Vous pouvez transmettre une fonction en déclarant son nom avant de déclarer le corps de fonction réel:

local func1
local func2 = function()
  func1()
end
func1 = function()
  --do something
end

Cependant, les déclarations avant ne sont nécessaires que lorsque vous déclarez des fonctions avec la portée locale.C'est généralement ce que vous voulez faire, mais Lua prend également en charge une syntaxe davantage comme C, auquel cas la déclaration en avant n'est pas nécessaire:

function func2()
  func1()
end
function func1()
  --do something
end

Test sous la Lua intégrée dans le freeswitch, la déclaration à terme ne fonctionne pas:

fmsg("CRIT", "It worked.")
function fmsg(infotype, msg)
   freeswitch.consoleLog(infotype,  msg .. "\n")
end

résultat:

[ERR] mod_lua.cpp: 203 /usr/local/freeswitch/scripts/foo.lua:1: tentative d'appeler Global 'FMSG' (une valeur nulle)

Inverser la commande (DUH) fonctionne.

Pour 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 le mécanisme.Donc, si vous incluez un 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 va 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:l' local la 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 va travailler, 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 la définition.J'utilise ce script Lua dans Nginx Conf.

Fil d'entrée Lua Aborté: Erreur d'exécution: Lua_redirect.lua: 109: Tentative d'appel d'appeler Global 'ThrowerRorifany' (une valeur NIL)

Snippet de code -

...
throwErrorIfAny()
...

function throwErrorIfAny()
    ngx.say("request not allowed")
    ngx.exit(ngx.HTTP_OK)
end

Étant donné que d'autres réponses ont également souligné que cela n'a pas fonctionné pour eux non plus, il est possible que la déclaration en avant de Lua ne fonctionne pas avec d'autres outils.

PS: Cela fonctionne bien si je mets la définition de la fonction avant, puis appelez-la après les quartiers.

Si vous utilisez OOP, vous pouvez appeler n'importe quel élément de fonction avant sa "définition".

local myClass = {}
local myClass_mt = { __index = myClass }

local function f1 (self)

    print("f1")
    self:later() --not yet "delared" local function
end

local function f2 (self)

    print("f2")
    self:later() --not yet "declared" local function   
end
--...
--later in your source declare the "later" function:
local function later (self)

    print("later")   
end

function myClass.new()    -- constructor
    local this = {}

    this = {
        f1 = f1,
        f2 = f2,
        later = later,  --you can access the "later" function through "self"
    }

    setmetatable(this, myClass_mt)

    return this
end

local instance = myClass.new()

instance:f1()
instance:f2()

sortie du programme:

f1
later
f2
later

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top