Lua local変数のサンプル

目次

概要

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

関連の記事

Lua 関数のサンプル

△上に戻る