在指令碼指令碼化,一個代碼區塊是控制結構或函數的體體。變量或函數的 範圍 是可以存取它的代碼,它可以是1>全球1>或4>本地4>。所有的方塊都可以存取全球變量和函數。一個方塊可以存
變數和函數的全球範圍預設為"全部",但在實際上,您通常會選擇先用本地範圍來宣告它們,因為 Luau 會以全球速度存取本地變數和函數,因此您通常會在變數或功數的名稱前面加上「local」。要在變數或功數上使用本地範圍,請將「local」前面加上「local」。 Errors: Error: 在變數或功數的名稱前面加上「<
指令碼不能存取其他指令碼中的全局和本地變量或函數。如果您想要在指令碼之間共享值和功能,請使用 ModuleScripts 。
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!
- Block B 可以 存取 A 區域的本地變量。
- Block C 可以 存取 A 和 B 區塊中的本地變量和函數。
- Block A 無法 存取 B 或 C 區塊中的本地變量和函數。
- Block B 無法 存取 C 區域的本地變量。
全球範圍
您宣告全球變數或函數後,任何位於同一個 script 的程式碼都可以存取它。變數和程式碼的程式碼範圍可以在 local 關鍵字中指定。
在下面的代碼中, testVar 有全球範圍內的本地 testFunc() 函數。當 Luau 呼叫 testFunc() 時,它會分配 2> testVar</
Example of global functions and variables
local function testFunc() -- 本地範圍
testVar = 64 -- 全球範圍
end
testFunc()
print(testVar) -- 64
在下列代碼中,全球變量 x 從 0 開始,每次增加 1 與每個重複的 1>2> for2> 循環,並在此後列印最終值為 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 使用哈希查找來存取全球變數和函數,因此它在履約上很貴重。使用全球變數在時間敏感循環中使用可能使它比使用本地變數在同一循環中使用更慢。
- Luau 在範圍結束後會擁有本地變數,以降低記憶體使用。
- 您可以在同一個脚指令碼中存取全球變量和函數,但不能在多個脚本之間。因此,全球變量或函數不提供任何對範圍內等同的好處、上值或暗影。
本地範圍
Luau 只能在您宣告它的代碼區塊中存取本地變數或函數。建立本地範圍的變數可以提供更嚴格的控制,因為它的值可以變更在任何時間和位置。
在下列代碼中,testFunc() 函數和<
local function testFunc() -- 本地範圍
local testVar = 64 -- 本地範圍
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil
在下面的代碼中,本地變數 x 的值在第 1 行為 0 。隨著 Luau 在 for 循環中移動,另一個本地變數 2> x2> 的值為 5>
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 在 1> f()1> 是一個 4> upvalue4>。
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5
暗影
在你宣告並分配本地變數後,你可以在其範圍級別和子級別中閱取它。如果你在子級別級等級中重新宣告並重新分配變數,那麼你就會在新的子級別中建立新的本地變數,並且其名稱與上一個分配的值不同。這種技術,稱為 陰影 ,會幫助你重用名
在下面的代碼中,Luau 暗影變量 x。變量 x 在 f() 是一個 1>陰影1> 變量。
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5
您也可以重新宣告本地變量,並且不要分配值,以便在其範圍層級和下一個範圍層級中重新分配變量。重新宣告本地變量並且不要分配值設定為 nil。
在下面的代碼中,Luau 在 function
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