3.5 可視性規則
Lua は字句スコープ (lexically scope) の言語です。つまりローカル変数のスコープは宣言の直ぐ後ろにある文に始まり、最も内側のブロックに含まれる無文でない最後の文 (宣言含む) で終わります。例として次のプログラムを考えます:
x = 10 -- グローバル変数
do -- 新しいブロック
local x = x -- 新しい 'x', 値は 10
print(x) --> 10
x = x+1
do -- 新しいブロック
local x = x+1 -- 新しい 'x'
print(x) --> 12
end
print(x) --> 11
end
print(x) --> 10 (グローバルの x)
三行目の宣言 local x = x
では新しく定義される変数 x
はまだスコープに入っていないので、この文に含まれる二つ目の x
は外のブロックの変数を指します。
字句スコープの規則により、関数がローカル変数と同じスコープで定義された場合には、定義される関数はそのローカル変数に自由にアクセスできます。何らかのスコープの中で定義された関数がアクセスするローカル変数を、その関数のアップバリュー (upvalue) と呼びます。アップバリューは外部ローカル変数 (external local variable) あるいは外部変数 (extenral variable) とも呼ばれます。
local 文を実行するたびに新しいローカル変数が定義されることに注意してください。例えば
a = {}
local x = 20
for i = 1, 10 do
local y = 0
a[i] = function () y = y + 1; return x + y end
end
はクロージャ (無名関数のインスタンス) を十個生成します。これらのクロージャは異なる y
と共通の x
を持ちます。