Struktur kontrol adalah pernyataan yang mengelola aliran eksekusi kode Luau. Ada empat jenis struktur kontrol utama:
- Sebuah pernyataan jika kemudian lainnya melaksanakan 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 sementara kondisi tetap true .
- Sebuah lingkaran berulang mengeksekusi kode, dan mengulang eksekusi jika kondisinya adalah true .
- A untuk loop mengeksekusi kode sejumlah kali tertentu tergantung pada input yang ditentukan.
Kondisi untuk pernyataan if , loop while , dan loop repeat dapat menjadi ekspresi atau nilai Luau apa pun.Jika nilai tidak false atau nil , maka Luau mengevaluasinya sebagai true dalam pernyataan kondicional.Tidak seperti bahasa skrip lain, Luau menganggap kedua nol dan string kosong sebagai true .
Jika pernyataan
Pernyataan dasar if menguji kondisinya. Jika kondisi benar, maka Luau mengeksekusi kode di antara then dan end .
Anda dapat menggunakan pernyataan elseif untuk menguji kondisi tambahan jika kondisi if adalah salah.Anda dapat menggunakan pernyataan else untuk mengeksekusi kode jika semua if dan elseif kondisi gagal.Bagian elseif dan else adalah keduanya opsional, tetapi Anda tidak dapat menggunakan salah satu tanpa pernyataan awal if .
Dalam rantai if , elseif , dan else kondisi, Luau menguji kondisi dari atas ke bawah, berhenti di kondisi pertama true , dan mengeksekusi kode yang mengikutinya.
if 2 + 2 == 5 thenprint("Two plus two is five") -- Tidak mencetak karena kondisinya salahelseif 2 + 3 == 5 thenprint("Two plus three is five") -- Dua ditambah tiga adalah limaelseprint("All conditions failed") -- Tidak mencetak karena kondisi sebelumnya benarend
Sementara loop
Sebuah loop while — do mengevaluasi apakah kondisi yang ditentukan benar atau salah.Jika kondisinya adalah false atau nil , maka loop berakhir, dan Luau melewati kode di loop.Jika kondisi adalah true , maka Luau mengeksekusi kode dalam loop dan mengulangi prosesnya.
local timeRemaining = 10while timeRemaining > 0 doprint("Seconds remaining: " .. timeRemaining)task.wait(1)timeRemaining -= 1endprint("Timer reached zero!")--[[ Hasil keluaran:Seconds remaining: 10Seconds remaining: 9Seconds remaining: 8Seconds remaining: 7Seconds remaining: 6Seconds remaining: 5Seconds remaining: 4Seconds remaining: 3Seconds remaining: 2Seconds remaining: 1Timer reached zero!]]
Lingkaran tak terbatas
Anda dapat menggunakan loop while — do untuk menulis loop permainan tak terbatas dengan menetapkan true sebagai kondisi.
while true doprint("Looping...")task.wait(0.5)end--[[ Hasil keluaran:Looping...Looping...Looping...Looping......]]
Ulangi loop
The repeat — until loop berulang sampai kondisi benar.Tes kondisional mengevaluasi setelah blok kode dijalankan, sehingga blok kode selalu dijalankan setidaknya sekali.Tidak seperti bahasa lain, cakupan Luau dari variabel lokal yang dideklarasikan di dalam loop repeat - until termasuk kondisi.
local currentGoblinCount = 18-- Memunculkan goblin hingga maksimal 25 di gamerepeatspawnGoblin()currentGoblinCount += 1print("Current goblin count: " .. currentGoblinCount)until currentGoblinCount == 25print("Goblins repopulated!")--[[ Hasil keluaran:Current goblin count: 19Current goblin count: 20Current goblin count: 21Current goblin count: 22Current goblin count: 23Current goblin count: 24Current goblin count: 25Goblins repopulated!]]
Untuk loop
A untuk loop mengeksekusi kode sejumlah kali, baik berdasarkan hitungan numerik counter atau jumlah item di koleksi.
Numerik untuk loop
Sebuah loop for — do menentukan jumlah kali untuk mengeksekusi loop menggunakan respons.Lingkaran dideklarasikan dengan nilai awal, nilai akhir, dan peningkatan opsional.
Luau menetapkan counter sama dengan nilai awal, mengeksekusi blok kode dalam loop for , lalu menambahkan peningkatan ke respons.Jika peningkatan positif, maka proses diulang sampai counter sama atau lebih besar dari nilai akhir.Jika peningkatan negatif, maka proses diulang sampai counter sama dengan atau kurang dari nilai akhir.
Peningkatan opsional default ke 1. Tidak perlu menjadi angka keseluruhan.
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]]
Umum untuk loop
Lingkaran umum for berulang atas item dalam koleksi daripada urutan angka.Dengan loop umum for , Anda dapat mengeksekusi kode untuk setiap item dalam koleksi, dan dapat dengan mudah menggunakan setiap item dalam kode.
Untuk loop membutuhkan fungsi, atau iterator, untuk mengulangi berbagai jenis koleksi.Global ipairs() mengembalikan iterator untuk array, dan global pairs() mengembalikan iterator untuk kamus.Perpustakaan string memberikan string.gmatch() untuk mengulangi string.
Iterasi umum
Di Luau, Anda dapat mengulangi atas tabel menggunakan kata kunci in langsung di tabel, bukan 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 __iter metametode untuk membuat fungsi iterasi khusus.Contoh yang disengaja ini mengulangi melalui 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
]]
Matriks
Fungsi ipairs() kembalikan iterator yang mengiterasi indeks numerik di tabel dan kembalikan index dan value untuk setiap elemen.Ini membuatnya sesuai untuk array, di mana semua indeks adalah 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() kembalikan iterator yang mengiterasi semua indeks (termasuk indeks numerik) di tabel dan kembalikan key dan value untuk setiap entri di kamus.Urutan elemen melintasi di tabel kamus adalah arbitrer.Ini membuatnya sesuai untuk mengulangi atas kamus, di mana item disimpan di luar urutan 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]]
Pecahkan loop
Untuk memaksa siklus akhiri, gunakan kata kunci break . Sampel kode berikut menunjukkan cara memecahkan siklus tak berujung 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!")--[[ Hasil keluaran:12345Five seconds elapsed. Time to move on!]]
Lanjutkan loop
Untuk memaksa loop untuk berulang dan mulai lagi, gunakan kata kunci continue.Sebuah loop for akan mengulangi respons; while dan repeat — until akan memeriksa kondisi loop sebelum melanjutkan.Contoh kode berikut mendapatkan semua anak dari Instance dari spesifik ClassName .
local function GetChildrenOfClass(parent: Instance, className: string): {Instance}
local children = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- Mengulangi loop
table.insert(children, child)
end
return children
end