名前を表す文字列から関数を実行することは可能ですか?
つまり:私はstring x = "foo"
を持っています、それはできるでしょうx()
?関数名の文字列からのlua呼び出し関数
「はい」の場合、構文は何ですか?
名前を表す文字列から関数を実行することは可能ですか?
つまり:私はstring x = "foo"
を持っています、それはできるでしょうx()
?関数名の文字列からのlua呼び出し関数
「はい」の場合、構文は何ですか?
が簡単に行われているグローバル名前空間内の関数を呼び出すことです、とloadstring()
を必要としません。
x='foo'
_G[x]() -- calls foo from the global namespace
別のテーブル内の関数場合は、そのような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
名前は一意ではなく、異なる名前空間に多くの関数名fooが存在する可能性があります。しかし、_G['foo']
はグローバルネームスペースのfoo
です。
あなたがそうのようにLuaの中でサポートされている「エバール」を、やりたいように聞こえる:
assert(loadstring(x))()
おそらくかかわらず、最初のxに「()」を連結することをお勧めします。
loadstring
ここでの回答ではありません。初心者のためには、文字列にreturn
が必要です。その他の詳細は私が入りません。
THC4kは正しいアイデアを持っています。あなたは変数xに関数名を持っている場合、あなたがしたいの呼び出しは(@ THC4kで述べたように)
_G[x](arg1, arg2, ...)
私は頻繁にテーブル内の機能の束を置く:
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']
を使用できます。