Luaリファレンス 要注意点 ~グローバル変数~

グローバルのチェック

宣言していないグローバル変数へのIOの警告等は
strict.luaを利用する。

require "strict"

グローバル変数への_Gを利用したアクセス

_G[varname(type string)] = value でアクセス可能です。

_G["a"] = _G["value"] -- と書くのは
a = value             -- と同義

実際の使用シーンとしては、実行時に変数名が決まる場合に使用する。

value = loadstring("return" .. varname)()  --> 間違いではないがあまりよろしくない

などと記載するよりも

value = _G[varname]  --> ランタイムで変数名が決まるのであればこの書き方が良い


グローバル変数への_Gを利用したアクセス、フィールドが付いている場合

_G["io.read"]などとはアクセス出来ない。

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)

Lua 5.2setfenv, getfenv

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

これはデフォルトでは、_Gの複製となっている。


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-01-24 (日) 14:22:50 (850d)