Cấu trúc điều khiển là các tuyên bố quản lý dòng chảy thực thi mã Luau. Có bốn loại cấu trúc điều khiển chính:
- Một if sau đó else tuyên bố thực thi mã chỉ khi một điều kiện được chỉ định là true. Việc thực thi mã không lặp lại.
- Một vòng lặp while thực hiện mã chỉ khi một điều kiện được định nghĩa là true , và lặp lại thực hiện trong khi điều kiện vẫn còn true .
- Một vòng lặp lặp lại lặp lại mã và lặp lại thực thi nếu điều kiện là true .
- Một cho vòng lặp thực hiện mã một số lần tuỳ thuộc vào các đầu vào được chỉ định.
Điều kiện cho các tuyên bố if , vòng lặp while và vòng lặp repeat có thể là bất kỳ biểu hiện Luau hoặc giá trị nào.Nếu một giá trị không phải là false hoặc nil, thì Luau đánh giá nó như true trong các tuyên bố điều kiện.Không giống như các ngôn ngữ lập trình khác, Luau coi cả hai không và chuỗi trống là true .
Nếu câu lệnh
Tuyên bố cơ bản if kiểm tra điều kiện của nó. Nếu điều kiện là đúng, Luau thực hiện mã giữa then và end .
Bạn có thể sử dụng một tuyên bố elseif để kiểm tra các điều kiện bổ sung nếu điều kiện if là sai.Bạn có thể sử dụng một tuyên bố else để thực thi mã nếu tất cả if và elseif điều kiện thất bại.Các phần elseif và else đều là tùy chọn, nhưng bạn không thể sử dụng một trong hai mà không có tuyên bố if ban đầu.
Trong chuỗi if , elseif , và else điều kiện, Luau kiểm tra điều kiện từ trên xuống dưới, dừng lại tại điều kiện đầu tiên true , và thực hiện mã theo sau nó.
if 2 + 2 == 5 thenprint("Two plus two is five") -- Không in vì điều kiện là saielseif 2 + 3 == 5 thenprint("Two plus three is five") -- Hai cộng ba là nămelseprint("All conditions failed") -- Không in vì điều kiện trước đó là đúngend
Trong khi vòng lặp
Một vòng lặp while — do kiểm tra xem một điều kiện được chỉ định có đúng hay không.Nếu điều kiện là false hoặc nil thì vòng lặp kết thúc, và Luau bỏ qua mã trong vòng lặp.Nếu điều kiện là true , thì Luau thực thi mã trong vòng lặp và lặp lại quá trình.
local timeRemaining = 10while timeRemaining > 0 doprint("Seconds remaining: " .. timeRemaining)task.wait(1)timeRemaining -= 1endprint("Timer reached zero!")--[[ Kết quả ra:Seconds remaining: 10Seconds remaining: 9Seconds remaining: 8Seconds remaining: 7Seconds remaining: 6Seconds remaining: 5Seconds remaining: 4Seconds remaining: 3Seconds remaining: 2Seconds remaining: 1Timer reached zero!]]
Vòng lặp vô hạn
Bạn có thể sử dụng một vòng lặp while — do để viết vòng lặp trò chơi vô hạn bằng cách đặt true như điều kiện.
while true doprint("Looping...")task.wait(0.5)end--[[ Kết quả ra:Looping...Looping...Looping...Looping......]]
Lặp lại vòng lặp
Vòng lặp repeat — until lặp lại cho đến khi điều kiện là đúng.Bài kiểm tra điều kiện đánh giá sau khi khối mã chạy, vì vậy khối mã luôn chạy ít nhất một lần.Không giống như các ngôn ngữ khác, phạm vi Luau của một biến địa phương được tuyên bố bên trong một vòng lặp repeat - until bao gồm điều kiện.
local currentGoblinCount = 18-- Gọi các yêu tinh lên đến tối đa 25 trong trò chơirepeatspawnGoblin()currentGoblinCount += 1print("Current goblin count: " .. currentGoblinCount)until currentGoblinCount == 25print("Goblins repopulated!")--[[ Kết quả ra:Current goblin count: 19Current goblin count: 20Current goblin count: 21Current goblin count: 22Current goblin count: 23Current goblin count: 24Current goblin count: 25Goblins repopulated!]]
Đối với vòng lặp
A cho vòng lặp thực hiện mã một lần theo số lần đã định, hoặc dựa trên một đếm số lượng hoặc số lượng vật phẩm trong một bộ sưu tập .
Số cho vòng lặp
Một vòng lặp for — do xác định số lần thực hiện vòng lặp bằng cách sử dụng một trả giáđếm.Vòng lặp được tuyên bố với giá trị bắt đầu, giá trị kết thúc và tăng tùy chọn.
Luau đặt giá trị đếm bằng giá trị bắt đầu, thực hiện khối mã trong vòng lặp for, sau đó thêm tăng vào trả giátrị đếm.Nếu tăng là dương tính, thì quá trình lặp lại cho đến khi bộ đếm bằng hoặc lớn hơn giá trị cuối cùng.Nếu tăng là âm, quá trình lặp lại cho đến khi đếm tương đương hoặc nhỏ hơn giá trị cuối cùng.
Tăng tối thiểu bắt buộc sẽ là 1 . Nó không cần phải là một số lẻ.
for counter = 1, 3 doprint(counter)end--[[ Kết quả ra:123]]for counter = 1, 6, 2 doprint(counter)end--[[ Kết quả ra:135]]for counter = 2, 0, -0.5 doprint(counter)end--[[ Kết quả ra:21.510.50]]
Thông thường cho vòng lặp
Vòng lặp chung for lặp qua các mục trong một bộ sưu tập thay vì một chuỗi số.Với các vòng lặp chung for, bạn có thể thực thi mã cho mỗi vật phẩm trong bộ sưu tập, và có thể dễ dàng sử dụng mỗi vật phẩm trong mã.
Vòng lặp cần một chức năng, hoặc iterator, để lặp lại qua các loại khác nhau của bộ sưu tập.Toàn cầu ipairs() trả về một iterator cho mảng, và toàn cầu pairs() trả về một iterator cho từ điển.Thư viện string cung cấp string.gmatch() để lặp lại qua các chuỗi.
Lặp lại chung
Ở Luau, bạn có thể lặp lại trên một bảng bằng cách sử dụng từ khóa in trực tiếp trên bảng, thay vì sử dụng chức năng lặp lại như ipairs() :
for i, v in {1, 2, 3, 4, 5} doprint(i, v)end
Lặp lại hóa chung cũng cho phép bạn sử dụng __iter metamethod để tạo một chức năng trình lặp tùy chỉnh.Ví dụ này được lặp lại trên một mảng theo thứ tự ngược lại, từ yếu tố cuối cùng của nó đến yếu tố đầu tiên:
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
--[[ Kết quả ra:
5 5
4 4
3 3
2 2
1 1
]]
Mảng
Chức năng ipairs() trả về một iterator lặp qua các chỉ mục số trong bảng và trả về index và value cho mỗi yếu tố.Điều này làm cho phù hợp với các mảng, nơi tất cả các chỉ mục đều là số.
local array = {"a", "b", "c", "d", "e"}for index, value in ipairs(array) doprint(index, value)end--[[ Kết quả ra:1 a2 b3 c4 d5 e]]
Từ điển
Chức năng pairs() trả về một iterator lặp qua tất cả các chỉ mục (bao gồm cả chỉ mục số) trong một bảng và trả về một key và value cho mỗi bản ghi trong từ điển.Thứ tự lướt qua các yếu tố trong bảng từ điển là tùy tiện.Điều này làm cho nó phù hợp để lặp lại qua các từ điển, nơi các mục được lưu ra khỏi trật tự với các chỉ mục không phải là số.
local dictionary = {[1] = "a",["Hello"] = "b",[5] = "c",[true] = "d",["World"] = "f",[false] = "e"}for key, value in pairs(dictionary) doprint(key, value)end--[[ Kết quả ra:Hello btrue dfalse eWorld f5 c1 a]]
Phá vòng lặp
Để buộc một vòng lặp kết thúc, hãy sử dụng từ khóa break. Ví dụ sau đây cho thấy cách phá vỡ một vòng lặp vô hạn 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!")--[[ Kết quả ra:12345Five seconds elapsed. Time to move on!]]
Tiếp tục vòng lặp
Để buộc một vòng lặp lặp lại và bắt đầu lại, hãy sử dụng từ khóa continue.Một vòng lặp for sẽ lặp qua trả giáđếm; while và repeat — until sẽ kiểm tra điều kiện vòng lặp trước khi tiếp tục.Ví dụ mã sau đây nhận tất cả các con của một Instance của một đối tượng cụ thể ClassName.
local function GetChildrenOfClass(parent: Instance, className: string): {Instance}
local children = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- Lặp lại vòng lặp
table.insert(children, child)
end
return children
end