Topik ini membahas pernyataan kendali Lua, yaitu percabangan dengan if, perulangan while dan repeat, perulangan for numerik maupun generik, serta keluar dini dengan break. Setelah menyelesaikannya, struktur kendali dapat dipilih sesuai bentuk masalahnya dan aturan pengujian kondisi pada setiap struktur dapat dijelaskan.
Percabangan dengan if#
Pernyataan if menguji satu kondisi dan menjalankan bloknya apabila kondisi benar. Bentuk lengkapnya menggabungkan kata if, ekspresi kondisi, kata then, blok pernyataan, serangkaian cabang elseif, satu blok else, dan penutup end. Kondisi diuji dari atas ke bawah, blok pertama yang kondisinya benar dijalankan, sedangkan blok else menjadi jalan terakhir apabila seluruh kondisi palsu.
Kata elseif ditulis serangkai dan tidak memerlukan end tambahan, sehingga seluruh rangkaian cabang tetap menjadi satu pernyataan. Lua tidak menyediakan pernyataan switch, dan rangkaian elseif mengambil perannya. Tanda kurung di sekeliling kondisi bersifat opsional, dan pengujian mengikuti aturan nilai kebenaran, yaitu hanya nil dan false yang palsu.
Diagram berikut menggambarkan urutan pengujian pada pernyataan if, elseif, dan else, dengan cabang pertama yang benar memutus percabangan.
Berkas berikut mengonversi skor ujian menjadi predikat. Kondisi diurutkan dari batas tertinggi, sehingga urutan pengujian menentukan hasilnya dan satu blok saja yang pernah dijalankan.
-- Konversi skor ujian menjadi predikat dengan if, elseif, dan else
local skor = 86
if skor >= 90 then
print("A")
elseif skor >= 80 then
print("B")
elseif skor >= 70 then
print("C")
else
print("D")
endBKeluaran B berasal dari kondisi kedua, karena 86 >= 90 palsu dan 86 >= 80 benar. Memutar urutan kondisi, misalnya menempatkan skor >= 70 lebih dahulu, menghasilkan predikat yang keliru untuk skor yang sama, sehingga penataan batas dari tinggi ke rendah menjadi bagian dari logika percabangan.
Perulangan while dan repeat#
while menguji kondisi sebelum setiap putaran dan menjalankan bloknya selama kondisi benar, sehingga perulangan yang kondisinya langsung palsu tidak pernah berjalan. Bentuknya terdiri atas kata while, ekspresi kondisi, kata do, blok, dan penutup end. Kondisi harus dapat berubah di dalam badan, biasanya melalui penugasan atas variabel yang diuji, agar perulangan berakhir.
-- while memotong sisa 30 pada setiap putaran sampai kondisinya palsu
local sisa = 100
while sisa >= 30 do
sisa = sisa - 30
end
print(sisa)10repeat menjalankan badan terlebih dahulu, kemudian menguji kondisi yang mengikuti kata until. Perulangan berhenti pada saat kondisi benar, sehingga badan dijalankan minimal satu kali bahkan apabila kondisi sudah benar sejak awal. Berbeda dari banyak bahasa lain, variabel lokal yang dideklarasikan di dalam badan repeat tetap terlihat pada ekspresi until, sehingga kondisi berhenti dapat menghitung nilai yang baru dibentuk oleh badannya.
-- repeat tetap menjalankan badan satu kali meskipun kondisi sudah benar di awal
local sisa = 0
repeat
sisa = sisa - 30
print(sisa)
until sisa <= 0-30Keluaran -30 menunjukkan badan tetap dijalankan satu kali meskipun kondisi 0 <= 0 sudah benar sejak awal, sehingga pemotongan tetap terjadi sebelum kondisi baru diuji.
-- Variabel lokal badan repeat tetap terlihat pada ekspresi until
local angka = 3
repeat
local kuadrat = angka * angka
print(kuadrat)
angka = angka - 1
until kuadrat == 19
4
1Keluaran memperlihatkan kuadrat, yang dideklarasikan di dalam badan, sah dibaca oleh until pada setiap putaran. Perulangan ini berhenti begitu nilai terakhirnya mencapai 1, sebagaimana diuji kondisi berhentinya.
Perulangan for numerik#
Perulangan for numerik mengeksekusi blok dengan jumlah putaran yang ditentukan tiga ekspresi, yaitu nilai awal, nilai akhir, dan langkah. Bentuknya for variabel = awal, akhir, langkah do dan ditutup dengan end, dengan langkah bernilai 1 apabila tidak ditulis. Variabel kontrol mengambil nilai awal, berubah sebesar langkah pada setiap putaran, dan perulangan berakhir apabila nilainya melewati nilai akhir.
-- for numerik menandai lima hari pertama jadwal piket
for hari = 1, 5 do
print("Hari " .. hari .. ": piket kelas")
endHari 1: piket kelas
Hari 2: piket kelas
Hari 3: piket kelas
Hari 4: piket kelas
Hari 5: piket kelasDua aturan for numerik sering luput dari perhatian. Batas dan langkah dinilai sekali di awal, sehingga perubahan nilai variabel lain di dalam badan tidak memperpanjang perulangan. Variabel kontrol merupakan variabel lokal badan, sehingga penugasan ke atasnya tidak mengubah langkah berikutnya.
-- Batas perulangan dinilai sekali di awal, bukan pada setiap putaran
local batas = 3
for i = 1, batas do
batas = 10
print(i)
end
print(batas)1
2
3
10Keluaran tetap menampilkan tiga putaran meskipun batas diubah menjadi 10 di dalam badan, karena nilai akhir sudah terkunci pada saat perulangan dimulai. Langkah negatif membuat perulangan menghitung mundur, dan perulangan dengan langkah negatif tidak pernah berjalan apabila nilai akhirnya lebih besar daripada nilai awalnya.
-- Langkah negatif menghitung mundur dari nilai awal menuju nilai akhir
for detik = 5, 1, -1 do
print(detik)
end5
4
3
2
1-- Variabel kontrol adalah lokal badan, penugasan ke atasnya tidak mengubah langkah
for i = 1, 3 do
i = i * 10
print(i)
end10
20
30Keluaran 10, 20, 30 menunjukkan bahwa penugasan i = i * 10 hanya memengaruhi nilai yang dibaca badan pada putaran itu, sedangkan urutan putaran tetap ditentukan oleh mekanisme perulangannya.
Perulangan for generik#
Perulangan for generik menjalankan blok untuk setiap nilai yang dihasilkan sebuah fungsi iterator (iterator), yaitu fungsi yang mengembalikan elemen berikutnya pada setiap panggilan. Bentuknya for daftarVariabel in ekspresi do, dengan daftar variabel yang menerima keluaran iterator pada setiap putaran, dan perulangan berakhir ketika keluaran pertamanya bernilai nil. Dua iterator bawaan yang paling sering digunakan adalah ipairs dan pairs.
ipairs menelusuri bagian table yang berperan sebagai array, yaitu kunci bilangan mulai dari 1 hingga kunci pertama yang tidak ada. Iterator ini memberikan pasangan indeks dan nilai yang berurutan, sehingga cocok untuk deret nilai yang urutannya bermakna.
-- ipairs menelusuri bagian array sebuah table berurutan dari indeks 1
local nilai = {88, 92, 79}
for indeks, isi in ipairs(nilai) do
print(indeks, isi)
end1 88
2 92
3 79pairs menelusuri seluruh pasangan kunci-nilai yang ada dalam table, termasuk kunci bernama, tanpa menjamin urutan kunjungan. Untuk menghitung isi tanpa memedulikan urutan, pairs dipasangkan dengan penghitung sederhana.
-- pairs mengunjungi setiap pasangan kunci-nilai tanpa menjamin urutan
local stok = { pensil = 24, buku = 10, penghapus = 8 }
local cacah = 0
for kunci, isi in pairs(stok) do
cacah = cacah + 1
end
print(cacah)3Apabila keluaran perlu teratur, kunci dikumpulkan ke dalam satu table, diurutkan dengan table.sort dari pustaka standar, lalu ditelusuri kembali dengan ipairs. Nama _ pada posisi variabel merupakan konvensi untuk nilai yang sengaja diabaikan.
-- Kunci hasil pairs dikumpulkan dan diurutkan agar keluaran teratur
local stok = { pensil = 24, buku = 10, penghapus = 8 }
local daftarKunci = {}
local cacah = 0
for kunci, _ in pairs(stok) do
cacah = cacah + 1
daftarKunci[cacah] = kunci
end
table.sort(daftarKunci)
for _, kunci in ipairs(daftarKunci) do
print(kunci, stok[kunci])
endbuku 10
penghapus 8
pensil 24Keluar dini dengan break#
Pernyataan break menghentikan perulangan paling dalam yang memuatnya, dan eksekusi berlanjut pada pernyataan setelah perulangan tersebut. Penggunaan yang lazim adalah keluar segera begitu sasaran pencarian ditemukan, sehingga putaran sisanya tidak dikerjakan percuma.
-- break menghentikan perulangan paling dalam begitu sasaran ditemukan
local daftar = {35, 42, 78, 91, 64}
for posisi, isi in ipairs(daftar) do
if isi >= 90 then
print("Skor tertinggi ada pada posisi " .. posisi)
break
end
endSkor tertinggi ada pada posisi 4Keluaran memperlihatkan pencarian berhenti pada posisi keempat begitu nilai 91 ditemukan, padahal table masih memuat satu nilai lagi. Lua tidak menyediakan pernyataan continue untuk melompati satu putaran, sehingga pola penggantinya berupa pengujian bersyarat di awal badan yang mengabaikan sisa badan pada putaran yang tidak memenuhi syarat.
Ringkasan#
ifmenguji kondisi dari atas ke bawah denganelseifyang ditulis serangkai, dan blokelsedijalankan apabila seluruh kondisi palsu.whilemenguji kondisi sebelum badan, sedangkanrepeat...untilmengujinya setelah badan, sehingga badan dijalankan minimal satu kali dan variabel lokalnya terlihat pada ekspresiuntil.fornumerik menilai batas dan langkah sekali di awal, menggunakan variabel kontrol yang lokal pada badan, dan mendukung langkah negatif untuk menghitung mundur.forgenerik berpasangan denganipairsuntuk bagian array danpairsuntuk seluruh pasangan kunci-nilai, sedangkanbreakmenghentikan perulangan paling dalam.
Referensi#
- Referensi Manual Lua 5.4 — Lua.org — Bagian Control Structures dan For Statement menetapkan semantik if, while, repeat, serta kedua bentuk perulangan for.
- Programming in Lua — Lua.org — Bab pernyataan menjelaskan kelima struktur kendali beserta contoh pemakaiannya yang lengkap.