2009-11-24 22 views

Respuesta

33

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 
4

Los nombres no son únicos, puede haber muchos nombres de funciones foo en diferentes espacios de nombres. Pero _G['foo'] es foo en el espacio de nombres global.

1

Parece que usted quiere hacer un 'eval', que se apoya en Lua, así:

assert(loadstring(x))() 

Es probable que desea concatenar el "()" en x en primer lugar, sin embargo.

9

loadstring no es la respuesta aquí. Para empezar, necesitaría un return en la cadena y otros detalles en los que no entraré.

THC4k tiene la idea correcta; si tiene el nombre de función de la variable x, entonces la llamada que desea es

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

que con frecuencia ponen un montón de funciones en una tabla:

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

A continuación, se puede utilizar una cadena como un índice de la tabla y ejecutar su funciona así

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

Esto es el resultado:

function one: blabla 
function two: blablablabla 

Me parece que esto es más limpio que el uso de loadstring(). Si no desea crear una tabla de funciones especiales, puede usar _G['foo'].

Cuestiones relacionadas