function getfield (f)
local v = _G
for w in string.gmatch(f, "[%w_]+") do --文字列strに対して、呼び出されるごとにパターンpatternのキャプチャを順に返すイテレータ関数を返します。
--通常であれば正規表現で「\」を使うところを「%」で記載する。
--パターンにキャプチャが含まれていないときには、イテレータ関数の戻り値はパターンに合致する文字列全体となります。
v = v[w] --> io["read"]とするのだ
end
return v
end
getfield("io.read")
とすると期待通りの結果が得られる。
同様に
function setfield (f, v)
local t = _G
for w, d in string.gmatch(f, "([%w_]+)(%.?)") do --通常であれば正規表現で「\」を使うところを「%」で記載する。
if d == "." then
t[w] = t[w] or {} -- テーブルがなければ作成
t = t[w]
else
t[w] = v -- 代入を実行。(もう「.」がなくて最後の要素なので、これはフィールドなので代入する)
end
end
end
setfield("t.x.y", 10)