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?
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?
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
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
geliyor.
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, ...)
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.