โครงสร้างการควบคุม เป็นคำสั่งที่จัดการการไหลของการดำเนินการโค้ด Luau มีสี่ประเภทหลักของโครงสร้างการควบคุม:
- คําสั่ง ถ้าแล้วอื่น จะดําเนินการระบุรหัสเฉพาะเมื่อเงื่อนไขที่กําหนดเป็น true คําสั่งดําเนินการรหัสไม่ซ้ํากัน
- ลูป while ดำเนินโค้ดเฉพาะถ้าเงื่อนไขที่กำหนดเป็น และทำซ้ำการดำเนินการในขณะที่เงื่อนไขยังคงอยู่
- ลูปซ้ำ รหัสดำเนินการโค้ดและทำซ้ำการดำเนินการหากเงื่อนไขเป็น true
- A สําหรับลูป ดําเนินโค้ดจํานวนครั้งตามที่กําหนดไว้ขึ้นอยู่กับอินพุตที่ระบุ
เงื่อนไขสำหรับคําสั่ง if ลูป, while ลูป และ repeat ลูปสามารถเป็นคําสั่ง Luau หรือค่าใดก็ได้หากค่าไม่ใช่ false หรือ nil แล้ว Luau จะประเมินมันเป็น true ในคําสั่งเงื่อนไขไม่เหมือนภาษาสคริปต์อื่น ๆ Luau พิจารณาทั้งศูนย์และสตริงว่างเปล่าเป็น true
ถ้าคำสั่ง
คำสั่งพื้นฐาน if ทดสอบเงื่อนไข หากเงื่อนไขเป็นจริง Luau จะดำเนินโค้ดระหว่าง then และ end
คุณสามารถใช้คำสั่ง elseif เพื่อทดสอบเงื่อนไขเพิ่มเติมหากเงื่อนไข if เป็นเท็จคุณสามารถใช้คำสั่ง else เพื่อดําเนินการรหัสหากทั้งหมด if และ elseif เงื่อนไขล้มเหลวส่วน elseif และ else ทั้งสองเป็นตัวเลือก แต่คุณไม่สามารถใช้ได้โดยไม่มีคำสั่งเริ่มต้น if
ในลำดับของ if , elseif และ else เงื่อนไข Luau ทดสอบเงื่อนไขจากบนลงล่าง, หยุดที่เงื่อนไขแรก true และดำเนินโค้ดที่ตามมา
if 2 + 2 == 5 thenprint("Two plus two is five") -- ไม่พิมพ์เพราะเงื่อนไขเป็นเท็จelseif 2 + 3 == 5 thenprint("Two plus three is five") -- สองบวกสามคือห้าelseprint("All conditions failed") -- ไม่พิมพ์เพราะเงื่อนไขก่อนหน้าเป็นจริงend
ในขณะที่ลูป
ลูป while — do ประเมินว่าเงื่อนไขที่กำหนดเป็นจริงหรือเท็จหากเงื่อนไขคือ false หรือ nil แล้วลูปจะสิ้นสุดและ Luau จะข้ามโค้ดในลูปหากเงื่อนไขคือ true แล้ว Luau จะดำเนินโค้ดในลูปและทำซ้ำกระบวนการ
local timeRemaining = 10while timeRemaining > 0 doprint("Seconds remaining: " .. timeRemaining)task.wait(1)timeRemaining -= 1endprint("Timer reached zero!")--[[ ผลผลิตที่ได้:Seconds remaining: 10Seconds remaining: 9Seconds remaining: 8Seconds remaining: 7Seconds remaining: 6Seconds remaining: 5Seconds remaining: 4Seconds remaining: 3Seconds remaining: 2Seconds remaining: 1Timer reached zero!]]
ลูปไม่สิ้นสุด
คุณสามารถใช้ลูป while — do เพื่อเขียนลูปเกมไม่สิ้นสุดโดยการตั้งค่า true เป็นเงื่อนไข
while true doprint("Looping...")task.wait(0.5)end--[[ ผลผลิตที่ได้:Looping...Looping...Looping...Looping......]]
ทำซ้ำลูป
ลูป repeat — until ทำซ้ำจนกว่าเงื่อนไขจะเป็นจริงการทดสอบแบบมีเงื่อนไขประเมิน หลังจาก บล็อกโค้ดทำงานแล้ว ดังนั้นบล็อกโค้ดจะทำงานอย่างน้อยหนึ่งครั้งเสมอไม่เหมือนภาษาอื่นๆ ขอบเขต Luau ของตัวแปรท้องถิ่นที่ประกาศภายในลูป repeat — until รวมถึงเงื่อนไข
local currentGoblinCount = 18-- เรียกก๊อบลินสูงสุด 25 ในเกมrepeatspawnGoblin()currentGoblinCount += 1print("Current goblin count: " .. currentGoblinCount)until currentGoblinCount == 25print("Goblins repopulated!")--[[ ผลผลิตที่ได้:Current goblin count: 19Current goblin count: 20Current goblin count: 21Current goblin count: 22Current goblin count: 23Current goblin count: 24Current goblin count: 25Goblins repopulated!]]
สำหรับลูป
การดำเนินการซ้ำตามลําดับสําหรับลูปจะดําเนินการโค้ดจํานวนครั้งตามที่กําหนดไว้ ไม่ว่าจะเป็นตามเครื่องนับเลข หรือจํานวน รายการในคอลเลกชัน
ตัวเลขสำหรับลูป
ลูป for — do กำหนดจำนวนครั้งที่จะดำเนินการลูปโดยใช้เครื่องนับลูปจะถูกประกาศด้วยมูลค่าเริ่มต้น, มูลค่าสิ้นสุด และการเพิ่มขึ้นที่ไม่จำเป็น
Luau ตั้งค่านับเท่ากับมูลค่าเริ่มต้น ดำเนินบล็อกโค้ดในลูป for แล้วเพิ่มการเพิ่มขึ้นให้กับนับหากการเพิ่มเป็นบวกแล้วกระบวนการจะทำซ้ำจนกว่าเครื่องนับจะเท่ากับหรือมากกว่ามูลค่าสุดท้ายหากการเพิ่มเป็นลบ กระบวนการจะทำซ้ำจนกว่าเครื่องนับจะเท่ากับหรือน้อยกว่ามูลค่าสุดท้าย
การเพิ่มเติมทางเลือกจะเริ่มต้นที่ 1 ไม่จำเป็นต้องเป็นตัวเลขทั้งหมด
for counter = 1, 3 doprint(counter)end--[[ ผลผลิตที่ได้:123]]for counter = 1, 6, 2 doprint(counter)end--[[ ผลผลิตที่ได้:135]]for counter = 2, 0, -0.5 doprint(counter)end--[[ ผลผลิตที่ได้:21.510.50]]
ทั่วไปสำหรับลูป
ลูปทั่วไป for ซ้ำไปเหนือรายการในคอลเลกชันแทนที่จะเป็นลำดับของตัวเลขด้วยลูปทั่วไป for รหัส
สำหรับลูปต้องมีฟังก์ชันหรือผู้รวบรวมเพื่อจัดทำซ้ำประเภทคอลเลกชันที่แตกต่างกันทั่วโลก ipairs() ส่งคืนตัวเรียกสําหรับลำดับและทั่วโลก pairs() ส่งคืนตัวเรียกสําหรับสารานุกรมห้องสมุด string ให้บริการ string.gmatch() ในการเลื่อนผ่านสตริง
การซ้ำแบบทั่วไป
ใน Luau คุณสามารถทำซ้ำบนตารางโดยใช้คําสําคัญ in โดยตรงบนตารางแทนที่จะใช้ฟังก์ชันผู้ซ้ำเช่น ipairs() :
for i, v in {1, 2, 3, 4, 5} doprint(i, v)end
การหมุนทั่วไปยังช่วยให้คุณสามารถใช้ metamethod __iter เพื่อสร้างฟังก์ชัน iterator ที่กําหนดเองตัวอย่างที่สร้างขึ้นนี้จะซ้ำรอบอาร์เรย์ในลำดับย้อนกลับ จากองค์ประกอบสุดท้ายไปยังองค์ประกอบแรก:
local myTable = {1, 2, 3, 4, 5}
myMetatable = {
__iter = function(t)
local i = #t + 1
return function()
i -= 1
if i > 0 then
return i, t[i]
end
end
end,
}
setmetatable(myTable, myMetatable)
for i, v in myTable do
print(i, v)
end
--[[ ผลผลิตที่ได้:
5 5
4 4
3 3
2 2
1 1
]]
คอลเลกชัน
ฟังก์ชัน ipairs() จะคืนตัวเลื่อนที่เลื่อนผ่านดัชนีทางเลขในตารางและคืน index และ value สำหรับแต่ละองค์ประกอบสิ่งนี้ทำให้เหมาะสำหรับคอลเลกชันที่ทั้งหมดของดัชนีเป็นตัวเลข
local array = {"a", "b", "c", "d", "e"}for index, value in ipairs(array) doprint(index, value)end--[[ ผลผลิตที่ได้:1 a2 b3 c4 d5 e]]
สารานุกรม
ฟังก์ชัน pairs() จะคืนตัวเลื่อนที่เลื่อนผ่านทุกดัชนี (รวมถึงดัชนีเชิงตัวเลข) ในตารางและคืน key และ value สำหรับแต่ละรายการในสารานุกรมลำดับการเดินทางขององค์ประกอบในตารางสารานุกรมมีอิสระสิ่งนี้ทำให้เหมาะสมสำหรับการเลื่อนผ่านสารานุกรมที่รายการจะถูกจัดเก็บออกจากลำดับด้วยดัชนีที่ไม่ใช่ตัวเลข
local dictionary = {[1] = "a",["Hello"] = "b",[5] = "c",[true] = "d",["World"] = "f",[false] = "e"}for key, value in pairs(dictionary) doprint(key, value)end--[[ ผลผลิตที่ได้:Hello btrue dfalse eWorld f5 c1 a]]
ทำลายลูป
เพื่อบังคับให้ลูปสิ้นสุด ใช้คําสําคัญ break เพื่อแสดงวิธีทำลายลูปไม่สิ้นสุด while — do ต่อไปนี้ตัวอย่างโค้ดแสดงวิธีทำลายลูปไม่สิ้นสุด
local secondsElapsed = 0local timeout = 5while true dotask.wait(1)secondsElapsed += 1print("Seconds elapsed:", secondsElapsed)if secondsElapsed == timeout thenbreakendendprint("Five seconds elapsed. Time to move on!")--[[ ผลผลิตที่ได้:12345Five seconds elapsed. Time to move on!]]
ดำเนินการซ้ำต่อไป
เพื่อบังคับให้ลูปซ้ำและเริ่มต้นอีกครั้งใช้คําสําคัญ continueลูป for ต่อรอง; while และ repeat — until จะตรวจสอบเงื่อนไขลูปก่อนที่จะดำเนินการต่อตัวอย่างโค้ดต่อไปนี้ได้รับลูกทั้งหมดของ Instance ของเฉพาะ ClassName ที่กำหนด
local function GetChildrenOfClass(parent: Instance, className: string): {Instance}
local children = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- ทำซ้ำลูป
table.insert(children, child)
end
return children
end