llamar a una función en el espacio de nombres global (como se ha mencionado por @ THC4k) es fácil de hacer, y no requiere loadstring()
.
x='foo'
_G[x]() -- calls foo from the global namespace
Usted tendría que utilizar loadstring()
(o caminar cada tabla) si la función en otra tabla, como si x='math.sqrt'
.
Si se usa loadstring()
, no solo desearía anexar paréntesis con elipse (...)
para permitir los parámetros, sino también agregar return
al frente.
x='math.sqrt'
print(assert(loadstring('return '..x..'(...)'))(25)) --> 5
o caminar las tablas:
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