Lua における「環境」
Lua では getfenv, setfenv (function env?) という関数を使って環境を取得したり、セットしたりできる。
これは JavaScript における「変数オブジェクト」にアクセスできるイメージかな
a = loadstring([[
function hoge ()
print("hoge", fuga)
end
]])
local env = {}
-- copy env
for i, v in pairs(_G) do
env[i] = v
end
setfenv(a, env)
a() -- セットした環境で実行する
env.hoge() -- hoge, nil
env.fuga = "fuga"
env.hoge() -- hoge, fugaこうすると閉じたところで実行できる。サンドボックスみたいなのが作れそうなのでつくってみよう。
あるいは、
function foo (aaa, bbb)
local localvariable = "aaa"
for i, v in pairs(getfenv(1)) do
print(i, v) -- この関数の変数とその値を列挙
end
end
foo()
copy env って書いたけど、コピーされずに参照がそのままつっこまれてる。というか再帰的にテーブルをコピーしないとだめだ。