ขอบเขต

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

scriptingหรือฟังก์ชัน หรือ ฟังก์ชันขอบเขต ของตัวแปรหรือฟังก์ชันคือบล็อกโค้ดที่สามารถเข้าถึงได้และสามารถเป็น ทั่วโลก หรือ ท้องถิ่น บล็อกทั้งหมดสามารถเข้าถึงตัวแปรและฟังก์ชันทั่วโลกได้บล็อกสามารถเข้าถึงตัวแปรและฟังก์ชันท้องถิ่นในบล็อกพ่อของมัน แต่ไม่ใช่ในบล็อกลูกใดๆ

ตัวแปรและฟังก์ชันมีขอบเขตทั่วโลกโดยค่าเริ่มต้น แต่มักจะดีกว่าที่จะประกาศพวกเขาด้วยขอบเขตท้องถิ่นเพราะ 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 กำจัดตัวแปรท้องถิ่นหลังสิ้นสุดขอบเขตของพวกเขา ลดการใช้หน่วยความจํา
  • คุณสามารถเข้าถึงตัวแปรและฟังก์ชันทั่วโลกภายในสคริปต์เดียวกัน แต่ไม่ระหว่างสคริปต์หลายตัวดังนั้นตัวแปรหรือฟังก์ชันระดับโลกจะไม่ให้ประโยชน์ใดๆ เหนือตัวเทียบท้องถิ่นในขอบเขต หรือ upvalue หรือเงา

ขอบเขตท้องถิ่น

Luau สามารถเข้าถึงตัวแปรหรือฟังก์ชันท้องถิ่นได้เฉพาะในบล็อกของโค้ดที่คุณประกาศไว้การสร้างตัวแปรด้วยขอบเขตท้องถิ่นทำให้คุณมีการควบคุมอย่างใกล้ชิดเกี่ยวกับเมื่อและที่ค่าของมันเปลี่ยนแปลง

ในรหัสต่อไปนี้ฟังก์ชัน testFunc() และตัวแปร testVar มีขอบเขตท้องถิ่นเฉพาะโค้ดภายใน testFunc() เท่านั้นที่สามารถเข้าถึงตัวแปร testVar ได้ตัวแปร testVar ไม่มีค่าอยู่นอก testFunc() ดังนั้นการเรียก print(testVar) ภายใน testFunc() จะพิมพ์ค่าของ testVar แต่การเรียก print(testVar) นอก testFunc() จะพิมพ์ nil


local function testFunc() -- ขอบเขตท้องถิ่น
local testVar = 64 -- ขอบเขตท้องถิ่น
print(testVar) -- 64
end
testFunc()
print(testVar) -- nil

ในรหัสต่อไปนี้ ตัวแปรท้องถิ่น x มีค่า 0 ในบรรทัดที่ 1ในขณะที่ Luau ซ้ำผ่านลูป โดยตัวแปรท้องถิ่นที่แตกต่างกัน มีค่า จากนั้น Luau จะพิมพ์ตัวแปรเริ่มต้น x ด้วยค่าที่ไม่เปลี่ยนแปลง 0


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ตัวแปร x ใน f() เป็น upvalue


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 เงาตัวแปรท้องถิ่น fruitName ในฟังก์ชัน getFruitByColor()ฟังก์ชันระบุใหม่ fruitName เป็นตัวแปรเงาใหม่และตั้งค่าค่าของมันเป็น nilฟังก์ชันมีระดับสเกลลูกหลาน, ลูป ที่กำหนดค่าให้กับ ซึ่งจะกำหนดค่าให้กับ หลังจากลูป 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