2009-11-24 21 views
22

olan bir dizeden lua çağrı işlevi lua'nın, adını temsil eden bir diziden yürütmesi mümkün mü?
i.e: string x = "foo" var, x() yapmak mümkün mü?İşlev adı

Evet ise sözdizimi nedir?

cevap

33

kolayca yapılır genel ad alanında bir işlev çağırmak için, ve loadstring() gerektirmez.

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

Sen loadstring() kullanmak gerekir (veya her tablo yürümek) olsaydı x='math.sqrt' sanki böyle başka tablodaki fonksiyon.

loadstring() kullanılıyorsa, parametrelere izin vermek için (...) elipsiyle parantez eklemek değil, aynı zamanda ön tarafa return ekleyin.

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

veya yürümek tablolar:

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

Adlar benzersiz değildir, farklı ad alanlarında birçok işlev adı olabilir. Ancak _G['foo'] genel ad alanında foo'dur.

assert(loadstring(x))() 

Muhtemelen ilk "()" üzerine x bitiştirmek isteyeceksiniz olsa: Eğer şöyle Lua desteklenen bir 'eval' yapmak istiyorum gibi

9

loadstring burada cevap değildir. Yeni başlayanlar için dizede return'a ve girmeyeceğim diğer ayrıntılara ihtiyacınız olacak.

THC4k doğru fikre sahiptir; Eğer değişken x işlev adı varsa, o zaman istediğiniz çağrı (@ THC4k tarafından belirtildiği gibi)

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

Sık sık bir tablodaki fonksiyonları bir demet koyun:

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

Sonra bir tablo endeksi olarak bir dize kullanabilir ve çalıştırabilirsiniz senin bu gibi işlevsellik ( ) Sonuç:

function one: blabla 
function two: blablablabla 

Bunu bulmak loadstring() kullanarak daha temiz olmasını. Özel bir işlev tablosu oluşturmak istemiyorsanız, _G['foo']'u kullanabilirsiniz.

İlgili konular