目次
概要
Luaの変数はデフォルトでグローバル変数になります。
localを付けることで、スコープ(有効範囲)を限定したローカル変数を定義できます。
実務では、意図的に共有する場合を除き、基本的にlocalを使うのが推奨です。
localとは (localを使用する/しない)
localを使用する
local function func()
local a = 10
print(a) -- 10
end
func()
print(a) -- nil(このスコープでは a は未定義)
local a=10は、関数内だけで有効なローカル変数です。
関数外のprint(a)は、関数内のaを参照しているわけではありません。
このコードの範囲では、aは他に定義されていないため、結果としてnilになります。
ポイント
- ローカル変数は外から見えない
- 外側で同名の変数がなければnilになる
localを使用しない(グローバル変数)
local function func()
a = 10
print(a) -- 10
end
func()
print(a) -- 10(グローバル変数なので参照可能)
a=10はlocalが付いていないため、グローバル変数になります。
そのため、関数の外からも参照できます。
注意点
- 意図せずグローバル変数を作ると、バグの原因になります
- 他のコードから値を書き換えられる可能性があります
localのスコープ
Luaのlocalは関数単位ではなく、ブロック単位のスコープです。
ブロックとは以下のような構造です。
- function ... end
- if...then ... end
- for ... do ... end
- do ... end
ループ内でのlocalの例
for i = 1, 3 do
local a = i * 10
print(a) -- 10 20 30
end
print(a) -- nil
aはforブロック内でのみ有効です。
ループ外ではaは存在しません。
ブロックスコープの例
do
local x = 100
print(x) -- 100
end
print(x) -- nil
do ... endでもスコープを作れます。
ループ外ではxは存在しません。
ローカル変数のメリット
1. バグを防げる
local count = 0
他のコードから意図せず変更されません。
2. パフォーマンスが良い
local sin = math.sin
Luaはローカル変数のアクセスが高速です。
3. 名前衝突を防げる
- グローバル変数は名前空間を汚染する
- ライブラリや他ファイルと衝突する可能性あり
よくあるミス
function func()
a = 10 -- 意図せずグローバル
end
以下のようにlocalをつけます。
function func()
local a = 10
end
関連の記事
