0Pricing
Lua Academy · レッスン

Luaで変数を宣言する

グローバル変数とローカル変数の違い、および命名規則を理解します。

「Luaで変数を宣言する」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

グローバル変数とローカル変数

Luaでは、変数はデフォルトでグローバルです。localキーワードを使わずにx = 10と書くと、どこからでもアクセスできるグローバル変数が作成されます。local x = 10と書くと、その変数は現在のブロックと入れ子になったブロック内に制限されます。

パフォーマンスと安全性のため、常にlocalを優先してください。ローカル変数へのアクセスは、グローバル変数より高速です。グローバル変数では_Gテーブルのハッシュテーブル検索が必要になるためです。

x = 100          -- global variable
local y = 200    -- local variable

do
  local z = 300  -- block-local
  print(x, y, z) -- 100  200  300
end

print(x, y)      -- 100  200
print(z)         -- nil  (out of scope)

localキーワード

localキーワードは、最も近い外側のブロック、つまり関数本体、do...endブロック、ループ本体、ファイルチャンクにスコープを限定した変数を宣言します。ローカル変数は宣言された行で作成され、そのブロックの末尾で存在しなくなります。

1行で複数のローカル変数を宣言し、同時に初期化できます。初期化されていないローカル変数のデフォルト値はnilです。

local a, b, c = 1, 2, 3
print(a, b, c)    -- 1  2  3

local d, e = 10   -- e is nil
print(d, e)       -- 10  nil

local f           -- nil until assigned
f = 42
print(f)          -- 42

変数の命名規則

Luaの識別子には次の規則があります。先頭は英字またはアンダースコアで、その後には英字、数字、アンダースコアを続けます。Luaは大文字と小文字を区別するため、Value、value、VALUEは異なる3つの変数です。

慣例として、通常の変数にはcamelCaseまたはsnake_case、定数にはUPPER_CASEを使い、プライベートなモジュールフィールドにはアンダースコアを付けます。ループカウンタ以外では、1文字だけの名前は避けてください。

local myVariable = 1     -- camelCase
local my_variable = 2    -- snake_case
local MAX_SIZE = 100     -- constant convention
local _private = "hidden" -- private convention

-- Case sensitivity demo
local lua = "lower"
local Lua = "upper"
print(lua, Lua)  -- lower  upper

_Gグローバルテーブル

Luaのすべてのグローバル変数は、_Gという特別なテーブルに格納されます。x = 10と書くことは、_G.x = 10と同じです。_Gを反復処理してすべてのグローバル変数を調べることができます。これはデバッグには便利ですが、本番コードでは危険です。

Lua 5.2以降では、実際の環境テーブルは_ENVであり、_Gはそれを指すように初期化されます。これを理解すると、_ENVを置き換えてコードをサンドボックス化できます。

myGlobal = 42
print(_G.myGlobal)   -- 42

-- Setting via _G is the same as direct assignment
_G.another = "hello"
print(another)        -- hello

-- Counting globals (many built-ins exist)
local count = 0
for k in pairs(_G) do count = count + 1 end
print("Globals:", count)

多重代入

Luaは多重代入に対応しており、1つの文で複数の変数に代入できます。右辺が先に評価され、その後、左から右へ代入されます。値より変数のほうが多い場合、余った変数にはnilが入ります。変数より値のほうが多い場合、余った値は破棄されます。

これにより、一時変数を使わずに変数を簡単に入れ替えられます。

-- Swap without temp variable
local a, b = 10, 20
a, b = b, a
print(a, b)   -- 20  10

-- More variables than values
local x, y, z = 1, 2
print(x, y, z)  -- 1  2  nil

-- More values than variables
local p, q = 1, 2, 3  -- 3 is discarded
print(p, q)   -- 1  2

スコープとブロックの境界

Luaのブロック区切りは、do...end、関数本体、if/elseif/else...end、while...end、repeat...until、for...endです。それぞれが新しいスコープレベルを作成します。do...endブロックは、他の処理を行わずにスコープだけを制限したい場合に便利です。

forループのヘッダーで宣言したローカル変数のスコープはループ本体に限られ、外側には漏れません。

for i = 1, 3 do
  local msg = "item " .. i
  print(msg)
end
-- print(i)   -- would be nil, i is gone
-- print(msg) -- would be nil, msg is gone

-- do...end for manual scoping
do
  local temp = expensive_computation or 0
  print(temp)
end
-- temp is nil here

定数:localの慣例

Luaには組み込みのconstキーワードがありません。値を変更しないことを示すため、UPPER_CASEの名前とlocalを使うのが慣例です。モジュールの先頭で定数をローカル変数として配置すると、これらの値が安定していることをJITコンパイラに知らせるヒントにもなります。

真の不変性が必要な場合は、変更時にエラーを発生させる__newindexを備えたプロキシテーブルを使えます。これはメタテーブルのレッスンで扱います。

local MAX_RETRIES = 3
local PI = 3.14159265358979
local APP_VERSION = "1.0.0"

-- Use them as read-only by convention
local area = PI * 5 * 5
print(area)           -- 78.539...
print(MAX_RETRIES)    -- 3

変数のシャドーイング

シャドーイングとは、内側のスコープで外側の変数と同じ名前のローカル変数を宣言することです。内側の宣言によってまったく新しい変数が作成され、そのスコープ内では外側の変数が隠されます。外側の変数は変更されず、内側のスコープが終了すると再び見えるようになります。

シャドーイングは混乱の原因になることがあります。入れ子になったスコープでは、できるだけ異なる名前を使ってください。ただし、入れ子になったループで同じループ変数名を再利用するなど、意図的に使う場合もあります。

local x = "outer"
do
  local x = "inner"  -- shadows outer x
  print(x)            -- inner
end
print(x)              -- outer (unchanged)

local n = 10
for n = 1, 3 do       -- loop n shadows outer n
  print(n)            -- 1, 2, 3
end
print(n)              -- 10 (outer unchanged)

グローバル汚染を避ける

意図しないグローバル変数は、Luaでよくあるバグです。ローカル変数名を打ち間違えると、新しいグローバル変数が何の警告もなく作成されます。プロジェクトでよく組み込まれるstrict.luaモジュールは、_Gにメタテーブルを追加し、宣言されていないグローバル変数の読み書きを検出します。

より簡単な方法は、常にlocalを使い、luac -pやluacheckなどのリンターを実行して、実行前に意図しないグローバル変数を検出することです。

-- Dangerous: typo creates a global silently
local counter = 0
coutner = 5  -- typo! creates global 'coutner'
print(counter)  -- 0 (not 5!)
print(coutner)  -- 5 (the typo global)

-- Fix: always use local keyword
local score = 0
score = 10  -- assigns to existing local
print(score) -- 10

nilの代入でグローバル変数を削除する

グローバル変数にnilを設定すると、_Gから削除され、メモリが解放されます。これがグローバル変数を「削除」する正しい方法です。ローカル変数の場合は、単にスコープ外に出せば同じ効果が得られ、ガベージコレクタがメモリを回収します。

多重代入でnilを渡す場合は注意してください。特に右辺に関数呼び出しがある場合など、状況によっては引数リストが途中で切り詰められることがあります。

myGlobal = "exists"
print(myGlobal)   -- exists
print(_G.myGlobal ~= nil)  -- true

myGlobal = nil
print(myGlobal)   -- nil
print(_G.myGlobal ~= nil)  -- false
-- The entry is removed from _G

確認問題

forループ本体の中でlocal x = 5と宣言した変数のスコープはどこまでですか?

まとめ:Luaでの変数宣言

このレッスンの重要なポイント:

  • 変数はデフォルトでグローバルなので、常にlocalを使う
  • ローカル変数は高速(ハッシュ検索が不要)で安全
  • 多重代入:a, b = b, aで1行で入れ替えられる
  • すべてのグローバル変数は_Gに格納され、nilを設定すると削除される
  • シャドーイング:内側のlocalは外側の変数を変更せずに隠す
  • 慣例として定数にはUPPER_CASEを使う

次は、算術演算子、関係演算子、論理演算子です。

よくある質問

「Luaで変数を宣言する」レッスンは無料ですか?

はい。「Luaで変数を宣言する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「Luaで変数を宣言する」で何を学びますか?

グローバル変数とローカル変数の違い、および命名規則を理解します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Luaで変数を宣言する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Luaのデータ型の概要
  2. Luaで変数を宣言する
  3. 算術演算子と関係演算子
  4. 型強制と型変換
← Lua Academyに戻る