スコープとブロック
CoddyのLuaジャーニー「Fundamentals」セクションの一部 — レッスン 86/90。
Luaでは、do...endブロックを使用して、コード内のどこにでも新しいスコープを作成できます。これらのブロックを使用すると、ローカル変数にアクセスできる場所を正確に制御でき、変数のスコープを精密に管理できます。
do...endブロックを使用して新しいスコープを作成する方法は次のとおりです:
local outerVar = "I'm outside"
do
local innerVar = "I'm inside"
print(outerVar) -- これは動作します
print(innerVar) -- これも動作します
end
print(outerVar) -- これは動作します
print(innerVar) -- これはエラーになります!スコープの強力な点は、異なるブロック内で同じ名前のローカル変数を持つことができ、それらが完全に分離された状態に保たれることです。
local name = "Alice"
do
local name = "Bob" -- 別の変数です!
print(name) -- "Bob" を出力します
end
print(name) -- "Alice" を出力します各 do...end ブロックは、ローカル変数用に独自の分離された環境を作成します。ブロック内で宣言された変数は外部のスコープに漏れ出すことはありませんが、外部スコープの変数は内部ブロックからアクセスできます。
チャレンジ
簡単ネストされた do...end ブロックを作成して、同じ名前を持つローカル変数が異なるスコープで完全に分離されたままであることを示します。
まず、外部スコープで値が 10 の playerLevel という名前のローカル変数を作成し、それを表示します。
次に、do...end ブロックを作成し、その中で以下を行います:
- 同じく
playerLevelという名前で、値が25の新しいローカル変数を宣言します - この内部の
playerLevelを表示します
内部ブロックが終了した後、外部の playerLevel を再度表示して、それが変更されていないことを示します。
これは、異なるスコープにある同じ名前のローカル変数が完全に独立していること、つまり内部変数が外部変数に影響を与えないことを示しています。
チートシート
do...end ブロックを使用して、コード内の任意の場所に新しいスコープを作成し、変数のスコープを制御できます:
local outerVar = "I'm outside"
do
local innerVar = "I'm inside"
print(outerVar) -- これは動作します
print(innerVar) -- これも動作します
end
print(outerVar) -- これは動作します
print(innerVar) -- これはエラーになります!異なるブロックにある同じ名前のローカル変数は、完全に別個のものとして扱われます:
local name = "Alice"
do
local name = "Bob" -- 別の変数です!
print(name) -- "Bob" を出力します
end
print(name) -- "Alice" を出力しますブロック内で宣言された変数は外部のスコープに漏れることはありませんが、外部スコープの変数は内部ブロックからアクセスできます。
自分で試してみよう
-- TODO: ここにコードを記述してくださいこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。