スクリプトでは、コードブロックは コントロール構造 または 機能 の体です。変数または関数の スコープ は、それにアクセスできるコードのブロックであり、 グローバル または ローカル であることができます。すべてのブロックはグローバル変数と機能にアクセスできます。ブロックは、親ブロックのローカル変数と機能にアクセスできますが、子ブロックのいずれもありません。
変数と関数はデフォルトでグローバルスコープを持っていますが、ローカルスコープで宣言する方がほぼ常に良いです。Luau はグローバル変数と関数に比べて、ローカル変数と関数にアクセスするのが速いからです。変数または関数にローカルスコープを与えるには、宣言するときに名前の前にキーワード local を置きます。
スクリプトは、他のスクリプトのグローバルおよびローカル変数や関数にアクセスできません。スクリプト間で値と機能を共有したい場合は、ModuleScripts を使用します。
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!

- ブロック B は ブロック A のローカル変数にアクセスできます。
- ブロック C は ブロック A と B のローカル変数と機能にアクセスできます。
- ブロック A は ブロック B または C のローカル変数と機能にアクセスできません。
- ブロック B は ブロック C のローカル変数にアクセスできません。
グローバルスコープ
グローバル変数または関数を宣言した後、同じ スクリプト のコードブロックでもアクセスできます。変数と関数は、local キーワードで宣言しない限り、グローバルスコープを持っています。
次のコードでは、testVar はローカルの testFunc() 関数内でグローバルスコープを持っています。Luau が testFunc() を呼び出すと、testVar に値 64 が割り当てられます。testVar はグローバルなスコープを持ち、そのため、print() 機能は、testFunc() 外部にあり、アクセスして 64 を印刷できます。
Example of global functions and variables
local function testFunc() -- ローカルスコープ
testVar = 64 -- グローバルスコープ
end
testFunc()
print(testVar) -- 64
次のコードでは、グローバル変数 が で始まり、 でそれぞれの ループで増加し、最後に 4 の最終値で再印刷します。
x = 0 -- グローバル変数 "x"for i = 1, 4 dox += 1print("Global 'x' = " .. x)endprint("Global 'x' = " .. x)--[[ 結果の出力:Global 'x' = 1Global 'x' = 2Global 'x' = 3Global 'x' = 4Global 'x' = 4]]
グローバル変数と機能を宣言するのが簡単であるのは、あまりタイプする必要がないためですが、グローバル変数と機能には、次のデメリットがあります:
- Luau はハッシュ検索でグローバル変数と機能にアクセスし、パフォーマンスの面から使用すると履行価になります。タイムクリティカルループでグローバル変数を使用すると、同じループでローカル変数を使用するより 10%以上遅く実行する可能性があります。
- Luau は、スコープが終了した後、ローカル変数を処分し、メモリ使用量を減少させます。
ローカルスコープ
Luau は、宣言したコードブロックのローカル変数または関数にのみアクセスできます。ローカルスコープで変数を作成すると、値が変更される時間と場所をより厳密に制御できます。
次のコードでは、testFunc() 関数と testVar 変数にローカルスコープがあります。testFunc() 内のコードだけが testVar 変数にアクセスできます。変数 は 以外の値を持っていないので、 内で呼び出すと の値が印刷されますが、 外で呼び出すと が印刷されます。
local function testFunc() -- ローカルスコープ
local testVar = 64 -- ローカルスコープ
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
次のコードでは、ローカル変数 x がライン 1 で値 0 を持っています。ルアウが ループを繰り返しているとき、異なるローカル変数 が値を持っています。次に、Luau は変更されない値で初期変数 を印刷します。
local x = 0 -- ローカル変数 "x"for i = 1, 4 dolocal x = 1 -- 異なる変数 "x"、この "for" ループにローカルprint("Loop 'x' = " .. x)endprint("Initial 'x' = " .. x)--[[ 結果の出力:Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Loop 'x' = 1Initial 'x' = 0]]
キャプチャ
ローカル変数を宣言して割り当てた後、スコープレベルでそれを読み、スコープが同じスコープに含まれるローカル変数の機能を読むことができます。この技術は キャプチャ と呼ばれます。
次のコードでは、機能 f がローカル変数 x をキャプチャします。変数 x は f() の 上値 です。
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
シャドウ
ローカル変数を宣言して割り当てた後、そのスコープレベルと子孫のスコープレベルで読むことができます。子孫のスコープレベルで変数を再宣言し、再割り当てすると、最も前の割り当てと同じ名前ですが異なる値を持つ新しいローカル変数を作成します。新しいローカル変数は、以前の割り当てからローカル変数に影響しません。この技術、 シャドウ と呼ばれるものは、値を再使用せずに変数の名前を再使用するのを助けます。
次のコードでは、Luau が変数 x をシャドウします。変数 x は f() 内の シャドウ 変数です。
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
値を割り当てずにローカル変数を再宣言して、スコープレベルと子孫のスコープレベルの両方で変数を再割り当てできます。ローカル変数に値を割り当てずに再宣言すると、その値は nil に設定されます。
次のコードでは、Luau が関数 getFruitByColor() でローカル変数 fruitName をシャドウします。機能は、fruitName を新しいシャドウ変数として再定義し、値を nil に設定します。機能には、子孫のスコープレベル、for ループ があり、値を fruitName に割り当てます。for ループの後、機能は fruitName シャドウ変数を返します。機能全体で、fruitName は最初の fruitName ローカル変数を上書きしない同じローカル変数です。
local fruitName = "Chocolate"
local fruitTable = {
Lemon = "Yellow",
Apple = "Red",
Orange = "Orange"
}
local function getFruitByColor(color)
local fruitName
for key, value in fruitTable do
if value == color then
fruitName = key
end
end
return fruitName
end
local fruit = getFruitByColor("Yellow")
print(fruit) -- レモン
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate