スコープ

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

スクリプトでは、コードブロックは コントロール構造 または 機能 の体です。変数または関数の スコープ は、それにアクセスできるコードのブロックであり、 グローバル または ローカル であることができます。すべてのブロックはグローバル変数と機能にアクセスできます。ブロックは、親ブロックのローカル変数と機能にアクセスできますが、子ブロックのいずれもありません。

変数と関数はデフォルトでグローバルスコープを持っていますが、ローカルスコープで宣言する方がほぼ常に良いです。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 do
x += 1
print("Global 'x' = " .. x)
end
print("Global 'x' = " .. x)
--[[ 結果の出力:
Global 'x' = 1
Global 'x' = 2
Global 'x' = 3
Global 'x' = 4
Global '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 do
local x = 1 -- 異なる変数 "x"、この "for" ループにローカル
print("Loop 'x' = " .. x)
end
print("Initial 'x' = " .. x)
--[[ 結果の出力:
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Initial 'x' = 0
]]

キャプチャ

ローカル変数を宣言して割り当てた後、スコープレベルでそれを読み、スコープが同じスコープに含まれるローカル変数の機能を読むことができます。この技術は キャプチャ と呼ばれます。

次のコードでは、機能 f がローカル変数 x をキャプチャします。変数 xf()上値 です。


local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5

シャドウ

ローカル変数を宣言して割り当てた後、そのスコープレベルと子孫のスコープレベルで読むことができます。子孫のスコープレベルで変数を再宣言し、再割り当てすると、最も前の割り当てと同じ名前ですが異なる値を持つ新しいローカル変数を作成します。新しいローカル変数は、以前の割り当てからローカル変数に影響しません。この技術、 シャドウ と呼ばれるものは、値を再使用せずに変数の名前を再使用するのを助けます。

次のコードでは、Luau が変数 x をシャドウします。変数 xf() 内の シャドウ 変数です。


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