Struktur kontrol adalah pernyataan yang mengelola alur eksekusi kode Luau. Ada empat jenis utama struktur kontrol:
- Pernyataan if then else mengeksekusi kode hanya jika kondisi yang ditentukan adalah true. Eksekusi kode tidak diulang.
- Sebuah while loop mengeksekusi kode hanya jika kondisi yang ditentukan adalah true, dan mengulangi eksekusi selama kondisi tetap true.
- Sebuah repeat loop mengeksekusi kode, dan mengulangi eksekusi jika kondisi adalah true.
- Sebuah for loop mengeksekusi kode sejumlah kali berdasarkan masukan yang ditentukan.
Kondisi untuk pernyataan if, while loop, dan repeat loop bisa berupa ekspresi atau nilai Luau. Jika sebuah nilai bukan false atau nil, maka Luau mengevaluasinya sebagai true dalam pernyataan kondisional. Berbeda dengan bahasa pemrograman skrip lainnya, Luau menganggap baik nol maupun string kosong sebagai true.
Pernyataan If
Pernyataan if dasar menguji kondisinya. Jika kondisi adalah true, maka Luau mengeksekusi kode antara then dan end.
Anda dapat menggunakan pernyataan elseif untuk menguji kondisi tambahan jika kondisi if adalah false. Anda dapat menggunakan pernyataan else untuk mengeksekusi kode jika semua kondisi if dan elseif gagal. Bagian elseif dan else keduanya bersifat opsional, tetapi Anda tidak dapat menggunakan salah satunya tanpa pernyataan if awal.
Dalam rangkaian kondisi if, elseif, dan else, Luau menguji kondisi dari atas ke bawah, berhenti pada kondisi true pertama, dan mengeksekusi kode yang mengikutinya.
if 2 + 2 == 5 thenprint("Dua ditambah dua adalah lima") -- Tidak mencetak karena kondisi adalah falseelseif 2 + 3 == 5 thenprint("Dua ditambah tiga adalah lima") -- Dua ditambah tiga adalah limaelseprint("Semua kondisi gagal") -- Tidak mencetak karena kondisi sebelumnya adalah trueend
While Loops
Sebuah loop while—do mengevaluasi apakah kondisi yang ditentukan adalah true atau false. Jika kondisi adalah false atau nil, maka loop berakhir, dan Luau melewati kode dalam loop tersebut. Jika kondisi adalah true, maka Luau mengeksekusi kode dalam loop dan mengulangi prosesnya.
local timeRemaining = 10while timeRemaining > 0 doprint("Detik yang tersisa: " .. timeRemaining)task.wait(1)timeRemaining -= 1endprint("Timer telah mencapai nol!")--[[ Hasil keluaran:Detik yang tersisa: 10Detik yang tersisa: 9Detik yang tersisa: 8Detik yang tersisa: 7Detik yang tersisa: 6Detik yang tersisa: 5Detik yang tersisa: 4Detik yang tersisa: 3Detik yang tersisa: 2Detik yang tersisa: 1Timer telah mencapai nol!]]
Infinite Loops
Anda dapat menggunakan loop while—do untuk menulis loop game tak hingga dengan mengatur true sebagai kondisi.
while true doprint("Berulang...")task.wait(0.5)end--[[ Hasil keluaran:Berulang...Berulang...Berulang...Berulang......]]
Repeat Loops
Loop repeat—until mengulangi sampai kondisi menjadi true. Uji kondisional mengevaluasi setelah blok kode dijalankan, jadi blok kode selalu dijalankan setidaknya sekali. Berbeda dengan bahasa lain, ruang lingkup variabel lokal yang dideklarasikan di dalam loop repeat—until mencakup kondisi.
local currentGoblinCount = 18-- Memanggil goblin hingga maksimum 25 dalam permainanrepeatspawnGoblin()currentGoblinCount += 1print("Jumlah goblin saat ini: " .. currentGoblinCount)until currentGoblinCount == 25print("Goblin telah diisi ulang!")--[[ Hasil keluaran:Jumlah goblin saat ini: 19Jumlah goblin saat ini: 20Jumlah goblin saat ini: 21Jumlah goblin saat ini: 22Jumlah goblin saat ini: 23Jumlah goblin saat ini: 24Jumlah goblin saat ini: 25Goblin telah diisi ulang!]]
For Loops
Sebuah for loop mengeksekusi kode sejumlah kali, baik berdasarkan penghitung numerik atau jumlah item dalam koleksi.
Numeric For Loops
Loop for—do menentukan jumlah kali untuk mengeksekusi loop menggunakan penghitung. Loop dinyatakan dengan nilai awal, nilai akhir, dan tambahan opsional.
Luau mengatur penghitung sama dengan nilai awal, mengeksekusi blok kode dalam loop for, kemudian menambahkan tambahan ke penghitung. Jika tambahan positif, maka proses diulang sampai penghitung sama dengan atau lebih besar dari nilai akhir. Jika tambahan negatif, maka proses diulang sampai penghitung sama dengan atau lebih kecil dari nilai akhir.
Tambahan opsional default adalah 1. Itu tidak harus berupa angka bulat.
for counter = 1, 3 doprint(counter)end--[[ Hasil keluaran:123]]for counter = 1, 6, 2 doprint(counter)end--[[ Hasil keluaran:135]]for counter = 2, 0, -0.5 doprint(counter)end--[[ Hasil keluaran:21.510.50]]
Generic For Loops
Loop for generik beriterasi atas item dalam koleksi daripada urutan angka. Dengan loop for generik, Anda dapat mengeksekusi kode untuk setiap item dalam koleksi, dan dapat dengan mudah menggunakan setiap item dalam kode.
For loops membutuhkan sebuah fungsi, atau iterator, untuk beriterasi atas berbagai jenis koleksi. Fungsi global ipairs() mengembalikan iterator untuk array, dan fungsi global pairs() mengembalikan iterator untuk kamus. Perpustakaan string menyediakan string.gmatch() untuk beriterasi atas string.
Iterasi Umum
Dalam Luau, Anda dapat beriterasi atas tabel menggunakan kata kunci in langsung pada tabel, alih-alih menggunakan fungsi iterator seperti ipairs():
for i, v in {1, 2, 3, 4, 5} doprint(i, v)end
Iterasi umum juga memungkinkan Anda menggunakan metode metamethod __iter untuk membuat fungsi iterator kustom. Contoh tidak biasa ini beriterasi atas sebuah array dalam urutan terbalik, dari elemen terakhir ke elemen pertama:
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
--[[ Hasil keluaran:
5 5
4 4
3 3
2 2
1 1
]]
Array
Fungsi ipairs() mengembalikan iterator yang beriterasi melalui indeks numerik dalam sebuah tabel dan mengembalikan index dan value untuk setiap elemen. Ini membuatnya sesuai untuk array, di mana semua indeks bersifat numerik.
local array = {"a", "b", "c", "d", "e"}for index, value in ipairs(array) doprint(index, value)end--[[ Hasil keluaran:1 a2 b3 c4 d5 e]]
Kamus
Fungsi pairs() mengembalikan iterator yang beriterasi melalui semua indeks (termasuk indeks numerik) dalam sebuah tabel dan mengembalikan key dan value untuk setiap entri dalam kamus. Urutan elemen yang dilalui dalam tabel kamus bersifat sewenang-wenang. Ini membuatnya sesuai untuk beriterasi atas kamus, di mana item disimpan secara tidak teratur dengan indeks non-numerik.
local dictionary = {[1] = "a",["Hello"] = "b",[5] = "c",[true] = "d",["World"] = "f",[false] = "e"}for key, value in pairs(dictionary) doprint(key, value)end--[[ Hasil keluaran:Hello btrue dfalse eWorld f5 c1 a]]
Break Loops
Untuk memaksa sebuah loop untuk berhenti, gunakan kata kunci break. Contoh kode berikut menunjukkan cara untuk memecah loop while—do yang tak berujung.
local secondsElapsed = 0local timeout = 5while true dotask.wait(1)secondsElapsed += 1print("Detik yang berlalu:", secondsElapsed)if secondsElapsed == timeout thenbreakendendprint("Lima detik telah berlalu. Saatnya untuk melanjutkan!")--[[ Hasil keluaran:12345Lima detik telah berlalu. Saatnya untuk melanjutkan!]]
Continue Loops
Untuk memaksa sebuah loop untuk iterasi dan memulai kembali, gunakan kata kunci continue. Loop for akan mengiterasi penghitung; while dan repeat—until akan memeriksa kondisi loop sebelum melanjutkan. Contoh kode berikut mendapatkan semua anak dari sebuah Instance dari ClassName tertentu.
local function GetChildrenOfClass(parent: Instance, className: string): {Instance}
local children = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- Mengiterasi loop
table.insert(children, child)
end
return children
end