*Luaリファレンス 要注意点 ~グローバル変数~ [#v6817fc2]

**グローバルのチェック [#wd20f2cb]
>宣言していないグローバル変数へのIOの警告等は''~
>''宣言していないグローバル変数への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)
}}

**Lua 5.2setfenv, getfenv [#u18c9439]
>setfenv, getfenvはLua5.2以降は廃止されているので~
Lua5.1/Lua5.2/Lua5.3複数のバージョンをターゲットとしている場合は注意を要する。
~
替わりに、_Gとは異なる、ENVというユーザーが変更することを想定済の環境変数が用意された。~
~
これはデフォルトでは、_Gの複製となっている。


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS