2009-11-24 282 views

回答

33

要調用的全局命名空間功能(如@ THC4k提到的)是很容易做到,而且不需要loadstring()

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

您將需要使用loadstring()(或步行的每個表),如果在另一個表的功能,例如,如果x='math.sqrt'

如果使用loadstring(),則您不僅希望在圓括號中添加橢圓(...)以允許參數,還可以將return添加到前面。

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

或步行表:

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

名稱不是唯一的,在不同的名稱空間中可能有許多函數名稱foo。但全局名稱空間中的_G['foo']foo

1

這聽起來像你想要做一個「EVAL」,這是在Lua支持像這樣:

assert(loadstring(x))() 

你可能想先串聯的「()」到X,雖然。

9

loadstring不是這裏的答案。對於初學者,您需要在字符串中輸入return,以及其他我不會涉及的細節。

THC4k有正確的想法;如果您在變量x的函數名,那麼你要調用的是

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

我經常放了一堆的功能表:

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

然後你可以使用一個字符串作爲表的索引和運行像這樣的功能

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

這是結果如下:

function one: blabla 
function two: blablablabla 

我覺得這比使用loadstring()要乾淨。如果您不想創建特殊功能表,則可以使用_G['foo']