2009-11-24 19 views

答えて

33

が簡単に行われているグローバル名前空間内の関数を呼び出すことです、と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 
4

名前は一意ではなく、異なる名前空間に多くの関数名fooが存在する可能性があります。しかし、_G['foo']はグローバルネームスペースのfooです。

1

あなたがそうのようにLuaの中でサポートされている「エバール」を、やりたいように聞こえる:

assert(loadstring(x))() 

おそらくかかわらず、最初のxに「()」を連結することをお勧めします。

9

loadstringここでの回答ではありません。初心者のためには、文字列にreturnが必要です。その他の詳細は私が入りません。

THC4kは正しいアイデアを持っています。あなたは変数xに関数名を持っている場合、あなたがしたいの呼び出しは(@ THC4kで述べたように)

_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']を使用できます。

関連する問題