2017-09-19 8 views
1

J'ai le scénario suivant dans lequel la position du code ne doit pas changer. Comment modifier ce code pour corriger l'erreur sans déplacer la fonction et la variable table. Je suis un nouveau venu Lua, juste 4 joursComment avoir une fonction comme valeur de champ dans une table lua, quand la fonction est déclarée à un point ultérieur?

function a() 
    print("function a"); 
end 

ftable = { 
    ["a"] = a, 
    ["b"] = b 
}; 

function b() 
    print("function b"); 
end 

ftable["a"](); -- prints 'function a' 
ftable["b"](); -- attempt to call field 'b' (a nil value) 

Mise à jour: En utilisant le mécanisme suivant, il est possible de le faire.

function a() 
    print("function a"); 
end 

ftable = { 
    ["a"] = a, 
    ["b"] = "b" 
}; 

function b() 
    print("function b"); 
end 

ftable["a"](); -- prints 'function a' 
_G[ftable["b"]](); 
+2

ce n'est pas possible. vous devriez plutôt vous demander pourquoi vous voulez faire ceci en premier lieu ... vous pourriez assigner votre fonction à ftable.b si – Piglet

+2

@Anish veuillez enlever votre réponse de la question et l'afficher comme réponse. Une fois que vous êtes satisfait des réponses, vous pouvez en accepter une, même si c'est la vôtre. (Le vôtre pourrait être amélioré en ajoutant une explication.) –

+1

La dernière ligne devrait être 'ftable [_G [" b "]]()'. – lhf

Répondre

2

La déclaration de table et la définition de fonction de Lua (et la syntaxe d'appel de fonction) sont très flexibles. Vous pouvez utiliser la clé de champ en tant qu'identificateur à la place de la syntaxe d'index, à condition que la clé soit une chaîne et soit également un identificateur valide ({ a = a } et ftable.a()). Cela semble être le cas avec vos clés a et b. Vous pouvez également effectuer l'affectation de zone avec l'instruction de définition de fonction (function ftable.b ...).

function a() 
    print("function a") 
end 

ftable = { 
    a = a 
} 

function ftable.b() 
    print("function b") 
end 

ftable.a() -- prints 'function a' 
ftable.b() -- prints 'function b' 

Bien sûr, vous pouvez également déplacer « fonction d'un » vers le bas et le code comme « fonction b ». cela laisserait ftable = { } au sommet.

Une différence par rapport à votre code. La variable globale b n'est plus définie sur la fonction. Dans la plupart des cas, cela serait considéré comme un avantage.

Je voudrais également réitérer ce @lhf said,

Il n'y a pas de déclarations dans Lua, seules les définitions.

Une définition de fonction (dans le cas général) est une expression. Lorsqu'il est évalué, il produit une valeur de fonction. Différents types d'instructions peuvent affecter la valeur à une variable ou à un champ, tout comme function ftable.b() ....

3

Vous ne pouvez pas faire cela. Il n'y a pas de déclarations en Lua, seulement des définitions. Vous devez définir des variables avant de les utiliser.

Ce que vous pouvez faire est d'enregistrer les noms des fonctions dans ftable puis fixer les valeurs avant de les utiliser:

ftable = { 
    ["a"] = true, 
    ["b"] = true, 
} 
... 
for k,v in pairs(ftable) do ftable[k]=_G[k] end 

Ce code suppose que vos fonctions sont définies à l'échelle mondiale.