2009-11-24 7 views

Répondre

33

Pour appeler une fonction dans l'espace de noms global (comme mentionné par @ THC4k) se fait facilement et ne nécessite pas loadstring().

x='foo' 
_G[x]() -- calls foo from the global namespace 

Vous devez utiliser loadstring() (ou à pied chaque table) si la fonction dans une autre table, comme si x='math.sqrt'.

Si vous utilisez loadstring(), vous souhaitez non seulement ajouter une parenthèse avec l'ellipse (...) pour autoriser les paramètres, mais également ajouter return au premier plan.

x='math.sqrt' 
print(assert(loadstring('return '..x..'(...)'))(25)) --> 5 

ou marcher les tables:

function findfunction(x) 
    assert(type(x) == "string") 
    local f=_G 
    for v in x:gmatch("[^%.]+") do 
    if type(f) ~= "table" then 
     return nil, "looking for '"..v.."' expected table, not "..type(f) 
    end 
    f=f[v] 
    end 
    if type(f) == "function" then 
    return f 
    else 
    return nil, "expected function, not "..type(f) 
    end 
end 

x='math.sqrt' 
print(assert(findfunction(x))(121)) -->11 
4

Les noms ne sont pas uniques, il peut y avoir beaucoup de noms de fonctions foo dans différents espaces de noms. Mais _G['foo'] est foo dans l'espace de noms global.

1

On dirait que vous voulez faire une « eval », qui est pris en charge dans Lua comme ceci:

assert(loadstring(x))() 

Vous aurez probablement envie de concaténer le «() » sur x premier, cependant.

9

loadstring n'est pas la réponse ici. Pour commencer, vous aurez besoin d'un return dans la chaîne, et d'autres détails que je ne vais pas entrer.

THC4k a la bonne idée; si vous avez le nom de la fonction dans la variable x, l'appel que vous voulez est

_G[x](arg1, arg2, ...) 
9

Je souvent mis un tas de fonctions dans un tableau:

functions = { 
     f1 = function(arg) print("function one: "..arg) end, 
     f2 = function(arg) print("function two: "..arg..arg) end, 
     ..., 
     fn = function(arg) print("function N: argh") end, 
} 

Ensuite, vous pouvez utiliser une chaîne comme un index de table et exécutez votre fonctionner comme ceci

print(functions["f1"]("blabla")) 
print(functions["f2"]("blabla")) 

Ceci est le résultat:

function one: blabla 
function two: blablablabla 

Je trouve cela plus propre que l'utilisation loadstring(). Si vous ne souhaitez pas créer de table de fonctions spéciales, vous pouvez utiliser _G['foo'].

Questions connexes