16. if / elseif / else

Selama ini, program kita berjalan dengan cara yang sama setiap kali dijalankan. Bab ini menambahkan kondisi: sebuah pertanyaan yang dijawab true atau false. Jawaban itulah yang menentukan blok kode mana yang dijalankan.

Membandingkan nilai

Kondisi dibangun dari operator perbandingan. Setiap operator membandingkan dua nilai dan mengembalikan boolean.

Operator Arti
== sama dengan
~= tidak sama dengan (catatan: ~, bukan !)
< kurang dari
> lebih dari
<= kurang dari atau sama dengan
>= lebih dari atau sama dengan
print(7 == 7)     -- true
print(7 == 8)     -- false
print("a" == "A") -- false  (case matters)
print(7 ~= 8)     -- true
print(3 < 5)      -- true
print(3 >= 3)     -- true

Operator kesamaan adalah == (dua tanda sama dengan). Satu = adalah penugasan — ia mengubah nilai variabel. Jadi if x = 7 adalah error sintaks; Lua menolak menjalankannya.

Pernyataan if

if menjalankan sebuah blok kode hanya ketika kondisinya benar.

local age = 16
if age >= 18 then
    print("You can vote.")
end

Baca dari kiri ke kanan: jika usianya minimal 18, maka cetak pesannya, akhir dari if. Indentasi (biasanya empat spasi) dibuat untuk kemudahan membaca; Lua tidak mewajibkannya, tapi selalu beri indentasi — itu membuat kesalahan lebih mudah ditemukan.

else untuk kasus lainnya

else dijalankan ketika kondisinya salah. Bersama if, keduanya mencakup kedua kemungkinan tepat satu kali:

local age = 16
if age >= 18 then
    print("You can vote.")
else
    print("Not old enough to vote yet.")
end

Tepat satu baris print yang dijalankan, tidak pernah keduanya sekaligus.

elseif untuk rantai kondisi

Untuk lebih dari dua kasus, rantaikan dengan elseif. Lua mencoba setiap kondisi secara berurutan dan berhenti pada yang pertama kali bernilai benar:

local score = 73
if score >= 90 then
    print("Grade: A")
elseif score >= 80 then
    print("Grade: B")
elseif score >= 70 then
    print("Grade: C")
elseif score >= 60 then
    print("Grade: D")
else
    print("Grade: F")
end

Urutan sangat penting: Lua mengambil kecocokan pertama. Kalau score >= 60 ditaruh paling atas, semua nilai lulus akan mendapat D — tidak ada yang dapat A, B, atau C.

Buka exercises/16/01-grade.lua. Ubah nilai score dan jalankan. Coba nilai tepat di batas (60, 70, 80, 90) untuk memastikan >= menyertakannya.

Menggabungkan kondisi dengan and, or, not

Kadang satu perbandingan tidak cukup. Lua memiliki tiga operator logika untuk menggabungkan boolean:

Operator Arti
and benar jika kedua sisi bernilai benar
or benar jika salah satu sisi bernilai benar
not membalik true menjadi false dan false menjadi true
local level = 12
local has_key = true

if level >= 10 and has_key then
    print("You can enter the dungeon.")
end

if level < 10 or not has_key then
    print("You are blocked.")
end

Tuliskan sebagai kata-kata. Lua tidak menggunakan &&, ||, maupun !.

Truthy dan falsy

Kondisi-kondisi di atas semuanya menghasilkan boolean sejati, tapi if menerima nilai apa pun. Aturan Lua:

  • nil dan false bersifat falsyif melewati bloknya.
  • Semua nilai lainnya bersifat truthy — termasuk 0, "", dan 0.0.

Ini mengejutkan banyak orang, terutama bahwa 0 bersifat truthy. Ini berguna untuk memeriksa apakah sebuah variabel memiliki nilai:

local name = io.read()    -- could be nil if input is empty in some cases
if name then
    print("Hello, " .. name)
else
    print("No name was entered.")
end

Buka exercises/16/02-truthy.lua dan jalankan. Bandingkan keluarannya dengan apa yang kamu perkirakan. Hasil untuk 0 dan "" sering kali mengejutkan.

PR (Pekerjaan Rumah)

Soal 1 — Genap atau ganjil

Buka exercises/16/homework/01-even-or-odd.lua. Minta masukan sebuah angka. Cetak even atau odd berdasarkan apakah n % 2 bernilai 0.

Soal 2 — Gerbang level Roblox

Buka exercises/16/homework/02-level-gate.lua. Ada dua variabel di bagian atas: level (sebuah angka) dan has_key (sebuah boolean). Cetak You can enter the dungeon. hanya ketika pemain berada di minimal level 10 dan memiliki kuncinya. Jika tidak, cetak salah satu dari:

  • Level too low. (jika levelnya saja yang menjadi masalah),
  • Missing the key. (jika levelnya sudah oke tapi kuncinya tidak ada),
  • Level too low and missing the key. (jika keduanya bermasalah).

Soal 3 — Huruf nilai

Buka exercises/16/homework/03-grade-letter.lua. Minta masukan sebuah skor (0 sampai 100). Cetak huruf nilai A, B, C, D, atau F menggunakan batas yang sama seperti contoh di bab ini.

Tantangan — Terbesar dari tiga angka

Buka exercises/16/homework/04-largest-of-three.lua. Tiga variabel menyimpan tiga angka. Cetak yang terbesar, menggunakan if dan operator perbandingan — tanpa perulangan, tanpa tabel, tanpa math.max. Tantangannya: tangani nilai seri dengan rapi (jika dua angka sama-sama terbesar, cetak salah satunya).

Masih bingung atau sudah selesai? Buka halaman solusi PR.