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