*Luaリファレンス 要注意点 ~グローバル変数~ [#v6817fc2] **グローバルのチェック [#wd20f2cb] >宣言していないグローバル変数へのIOの警告等は''~ [[strict.lua>dynamic_global_check]]を利用する。~ #sh(lua){{ require "strict" }} **グローバル変数への_Gを利用したアクセス [#i7dcf6cd] > _G[varname(type string)] = value でアクセス可能です。~ ~ #sh(lua){{ _G["a"] = _G["value"] -- と書くのは a = value -- と同義 }} ~実際の使用シーンとしては、''実行時に変数名が決まる場合に使用''する。 #sh(lua){{ value = loadstring("return" .. varname)() --> 間違いではないがあまりよろしくない }} などと記載するよりも #sh(lua){{ value = _G[varname] --> ランタイムで変数名が決まるのであればこの書き方が良い }} ~ **グローバル変数への_Gを利用したアクセス、フィールドが付いている場合 [#c1d97e86] > _G["io.read"]などとはアクセス出来ない。~ #sh(lua){{ 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") }} ~ とすると期待通りの結果が得られる。~ ~ 同様に~ #sh(lua){{ 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) }}