2009-11-24 8 views

Antwort

33

eine Funktion im globalen Namespace zu nennen (wie von @ THC4k erwähnt) ist leicht getan, und nicht loadstring() erfordert.

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

Sie müßten loadstring() verwenden (oder jede Tabelle zu Fuß), wenn die Funktion in einer anderen Tabelle, wie wenn x='math.sqrt'.

Wenn loadstring() verwendet wird, möchten Sie nicht nur Klammern mit Ellipse (...) anhängen, um Parameter zuzulassen, sondern fügen Sie auch return an der Vorderseite hinzu.

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

oder zu Fuß die Tische:

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

Namen sind nicht eindeutig, es können viele Funktionen Namen foo in verschiedenen Namespaces sein. Aber _G['foo'] ist foo im globalen Namespace.

1

Es klingt wie Sie eine ‚eval‘ tun wollen, die wie so in Lua unterstützt:

assert(loadstring(x))() 

Sie werden wahrscheinlich die „()“ auf x erst- verketten möchten.

9

loadstring ist nicht die Antwort hier. Für den Anfang benötigen Sie eine return in der Zeichenfolge, und andere Details, die ich nicht gehen werde.

THC4k hat die richtige Idee; wenn Sie den Funktionsnamen in der Variablen x, dann der Anruf Sie wollen, ist

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

Ich habe häufig eine Reihe von Funktionen in einer Tabelle:

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, 
} 

Dann können Sie einen String als Tabellenindex verwenden, und führen Sie Ihre Funktion wie folgt

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

Dies ist das Ergebnis:

function one: blabla 
function two: blablablabla 

ich dies als loadstring() mit sauberem zu finden sein. Wenn Sie keine spezielle Funktionstabelle erstellen möchten, können Sie _G['foo'] verwenden.