2007年 05月 07日

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 って書いたけど、コピーされずに参照がそのままつっこまれてる。というか再帰的にテーブルをコピーしないとだめだ。