Cấu trúc điều khiển là các câu lệnh quản lý luồng thực thi mã Luau. Có bốn loại cấu trúc điều khiển chính:
- Một câu lệnh if then else thực hiện mã chỉ khi một điều kiện được chỉ định là true. Mã không được thực thi 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 chỉ định là true, và lặp lại thực thi khi điều kiện vẫn là true.
- Một vòng lặp repeat thực hiện mã và lặp lại thực thi nếu điều kiện là true.
- Một vòng lặp for thực hiện mã một số lần nhất định tùy thuộc vào các đầu vào được chỉ định.
Điều kiện cho các câu lệnh if, vòng lặp while, và vòng lặp repeat có thể là bất kỳ biểu thức hoặc giá trị Luau nào. Nếu một giá trị không phải là false hoặc nil, thì Luau đánh giá nó là true trong các câu lệnh điều kiện. Khác với các ngôn ngữ kịch bản khác, Luau coi cả số không và chuỗi rỗng đều là true.
Câu lệnh If
Câu lệnh if cơ bản kiểm tra điều kiện của nó. Nếu điều kiện là đúng, thì Luau thực hiện mã giữa then và end.
Bạn có thể sử dụng câu lệnh elseif để kiểm tra các điều kiện bổ sung nếu điều kiện if là sai. Bạn cũng có thể sử dụng câu lệnh else để thực hiện mã nếu tất cả các điều kiện if và elseif đều không đúng. Các phần elseif và else đều là tùy chọn, nhưng bạn không thể sử dụng bất kỳ cái nào mà không có một câu lệnh if ban đầu.
Trong một chuỗi các điều kiện if, elseif, và else, Luau kiểm tra các điều kiện từ trên xuống dưới, dừng lại ở điều kiện đầu tiên là true, và thực hiện mã theo sau điều kiện đó.
if 2 + 2 == 5 thenprint("Hai cộng hai là năm") -- Không in vì điều kiện saielseif 2 + 3 == 5 thenprint("Hai cộng ba là năm") -- Hai cộng ba là nămelseprint("Tất cả các điều kiện đều không đúng") -- Không in vì điều kiện trước đó là đúngend
Vòng lặp While
Vòng lặp while—do đánh giá xem một điều kiện được chỉ định là đúng hay sai. 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 hiện mã trong vòng lặp và lặp lại quá trình.
local timeRemaining = 10while timeRemaining > 0 doprint("Số giây còn lại: " .. timeRemaining)task.wait(1)timeRemaining -= 1endprint("Đồng hồ đã đạt đến số không!")--[[ Kết quả đầu ra:Số giây còn lại: 10Số giây còn lại: 9Số giây còn lại: 8Số giây còn lại: 7Số giây còn lại: 6Số giây còn lại: 5Số giây còn lại: 4Số giây còn lại: 3Số giây còn lại: 2Số giây còn lại: 1Đồng hồ đã đạt đến số không!]]
Vòng lặp Vô hạn
Bạn có thể sử dụng một vòng lặp while—do để viết các vòng lặp trò chơi vô hạn bằng cách đặt true làm điều kiện.
while true doprint("Lặp lại...")task.wait(0.5)end--[[ Kết quả đầu ra:Lặp lại...Lặp lại...Lặp lại...Lặp lại......]]
Vòng lặp Repeat
Vòng lặp repeat—until lặp lại cho đến khi một điều kiện là true. Kiểm tra điều kiện diễn ra 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, không gian của một biến cục bộ được khai báo bên trong một vòng lặp repeat—until bao gồm điều kiện.
local currentGoblinCount = 18-- Tạo goblin lên đến tối đa 25 trong trò chơirepeatspawnGoblin()currentGoblinCount += 1print("Số lượng goblin hiện tại: " .. currentGoblinCount)until currentGoblinCount == 25print("Goblin đã được tái sinh!")--[[ Kết quả đầu ra:Số lượng goblin hiện tại: 19Số lượng goblin hiện tại: 20Số lượng goblin hiện tại: 21Số lượng goblin hiện tại: 22Số lượng goblin hiện tại: 23Số lượng goblin hiện tại: 24Số lượng goblin hiện tại: 25Goblin đã được tái sinh!]]
Vòng lặp For
Một vòng lặp for thực hiện mã một số lần nhất định, dựa trên một bộ đếm số hoặc số lượng mục trong một bộ sưu tập.
Vòng lặp For số
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 bộ đếm. Vòng lặp được khai báo với một giá trị bắt đầu, giá trị kết thúc, và khoảng tăng tùy chọn.
Luau đặt bộ đếm bằng giá trị bắt đầu, thực hiện khối mã trong vòng lặp for, rồi thêm khoảng tăng vào bộ đếm. Nếu khoảng tăng là dương, thì quá trình lặp lại cho đến khi bộ đếm bằng hoặc lớn hơn giá trị kết thúc. Nếu khoảng tăng là âm, thì quá trình lặp lại cho đến khi bộ đếm bằng hoặc nhỏ hơn giá trị kết thúc.
Khoảng tăng tùy chọn mặc định là 1. Nó không cần phải là một số nguyên.
for counter = 1, 3 doprint(counter)end--[[ Kết quả đầu ra:123]]for counter = 1, 6, 2 doprint(counter)end--[[ Kết quả đầu ra:135]]for counter = 2, 0, -0.5 doprint(counter)end--[[ Kết quả đầu ra:21.510.50]]
Vòng lặp For tổng quát
Vòng lặp for tổng quát 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 for tổng quát, bạn có thể thực hiện mã cho mỗi mục trong bộ sưu tập, và có thể dễ dàng sử dụng mỗi mục trong mã.
Các vòng lặp for cần một hàm, hoặc một iterator, để lặp qua các loại bộ sưu tập khác nhau. Hàm toàn cục ipairs() trả về một iterator cho các mảng, và hàm toàn cục pairs() trả về một iterator cho các từ điển. Thư viện string cung cấp string.gmatch() để lặp qua các chuỗi.
Lặp lại tổng quát
Trong Luau, bạn có thể lặp qua 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 một hàm iterator như ipairs():
for i, v in {1, 2, 3, 4, 5} doprint(i, v)end
Lặp lại tổng quát cũng cho phép bạn sử dụng phương thức huyền bí __iter để tạo một hàm iterator tùy biến. Ví dụ được tạo ra này lặp qua một mảng theo thứ tự ngược lại, từ phần tử cuối cùng đến phần 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ả đầu ra:
5 5
4 4
3 3
2 2
1 1
]]
Mảng
Hàm ipairs() trả về một iterator lặp qua các chỉ số số trong một bảng và trả về một index và value cho mỗi phần tử. Điều này làm cho nó phù hợp cho các mảng, nơi tất cả các chỉ số đều là số.
local array = {"a", "b", "c", "d", "e"}for index, value in ipairs(array) doprint(index, value)end--[[ Kết quả đầu ra:1 a2 b3 c4 d5 e]]
Từ điển
Hàm pairs() trả về một iterator lặp qua tất cả các chỉ số (bao gồm cả chỉ số số) trong một bảng và trả về một key và value cho mỗi mục trong từ điển. Thứ tự duyệt qua các phần tử trong một bảng từ điển là tùy tiện. Điều này làm cho nó phù hợp để lặp qua các từ điển, nơi các mục được lưu trữ không theo thứ tự với các chỉ số không phải 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ả đầu ra:Hello btrue dfalse eWorld f5 c1 a]]
Kết thúc vòng lặp
Để buộc một vòng lặp kết thúc, sử dụng từ khóa break. Mẫu mã sau đây cho thấy cách để kết thúc một vòng lặp vô hạn while—do.
local secondsElapsed = 0local timeout = 5while true dotask.wait(1)secondsElapsed += 1print("Số giây đã trôi qua:", secondsElapsed)if secondsElapsed == timeout thenbreakendendprint("Đã trôi qua năm giây. Thời gian để tiến tới!")--[[ Kết quả đầu ra:12345Đã trôi qua năm giây. Thời gian để tiến tới!]]
Tiếp tục vòng lặp
Để buộc một vòng lặp tiếp tục và bắt đầu lại, sử dụng từ khóa continue. Một vòng lặp for sẽ lặp lại bộ đếm; while và repeat—until sẽ kiểm tra điều kiện vòng lặp trước khi tiếp tục. Mẫu mã sau đây lấy tất cả các con của một Instance của một 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