Menu
Coddy logo textTech

スコープとブロック

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 ブロックは、ローカル変数用に独自の分離された環境を作成します。ブロック内で宣言された変数は外部のスコープに漏れ出すことはありませんが、外部スコープの変数は内部ブロックからアクセスできます。

challenge icon

チャレンジ

簡単

ネストされた do...end ブロックを作成して、同じ名前を持つローカル変数が異なるスコープで完全に分離されたままであることを示します。

まず、外部スコープで値が 10playerLevel という名前のローカル変数を作成し、それを表示します。

次に、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: ここにコードを記述してください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Fundamentalsのすべてのレッスン