2.2 環境とグローバル環境
§ 3.2 と § 3.3.3 でさらに説明しますが、自由な (どんな宣言にも束縛されていない) 名前 var
は構文的に _ENV.var
へ変換されます。また全てのチャンクは _ENV
という名前の外部ローカル変数のスコープでコンパイルされるので、_ENV
はチャンク内で自由な名前となることがありません (参照: § 3.3.2)。
この外部変数 _ENV
と自由な名前の変換規則が存在するにもかかわらず、_ENV
は通常の名前として利用できます。例えば _ENV
という名前の変数やパラメータを定義できます。自由な名前への参照はプログラムのその時点で見えている _ENV
を使って解決され、そのときには Lua の可視性に関する通常の規則 (§ 3.5) が適用されます。
_ENV
の値として使われるテーブルを環境 (environment) と呼びます。
Lua はグローバル環境 (global environment) と呼ばれる他の環境と区別される環境を持ちます。この値は C レジストリ (§ 4.3) の特別な場所に保存され、Lua のグローバル変数 _G
がこの値で初期化されます (_G
は Lua 内部で使われないので、_G
を書き換えたときに影響があるのはアプリケーションのコードだけです)。
Lua がチャンクをロードするとき、そのチャンクに関連付けられる _ENV
変数に対するデフォルト値はグローバル環境です (参照: load
)。そのためデフォルトでは、Lua コード内の自由な名前はグローバル環境の要素を指すことになります。このため自由な名前はグローバル変数 (global variable) とも呼ばれます。また全ての標準ライブラリはグローバル環境にロードされ、その一部はグローバル環境で実行されます。load
や loadfile
を使うと異なる環境を持ったチャンクをロードできます (C ではチャンクをロードした後にアップバリューを設定する必要があります。参照: lua_setupvalue
)。