17. Logika boolean lebih dalam

Bab 16 menggunakan and, or, dan not untuk menggabungkan kondisi. Ternyata ketiganya bisa lebih dari itu: memahami apa yang benar-benar dikembalikannya membuka trik-trik yang terus dipakai di kode Lua dan Roblox. Bab ini akan menggali lebih dalam soal kebenaran.

Truthy dan falsy, lagi

Ingat kembali aturan dari Bab 16: dalam sebuah kondisi, hanya false dan nil yang dianggap salah. Semua yang lain dianggap benar — termasuk 0, string kosong "", dan 0.0. Lua menyebut keduanya sebagai falsy, dan sisanya truthy.

if 0 then print("zero is truthy") end       -- prints
if "" then print("empty is truthy") end     -- prints
if nil then print("never") end              -- does not print

Ini mengejutkan orang yang terbiasa dengan bahasa lain, di mana 0 sering dianggap salah. Tidak begitu di Lua. Ingat hal ini setiap kali kamu menguji sebuah nilai secara langsung.

and dan or mengembalikan sebuah nilai

Ini yang jarang diceritakan ke pemula: and dan or tidak mengembalikan true atau false. Mereka mengembalikan salah satu dari dua sisinya, apa adanya.

  • a and b → jika a falsy, maka mengembalikan a; jika tidak, mengembalikan b.
  • a or b → jika a truthy, maka mengembalikan a; jika tidak, mengembalikan b.
print(5 and 10)          -- 10   (5 is truthy, so the second value)
print(nil and 10)        -- nil  (first is falsy, returned as-is)
print(false or "hi")     -- hi   (first falsy, so the second)
print("yes" or "no")     -- yes  (first truthy, returned at once)

Kalau dipakai dalam if, ini berperilaku seperti logika true/false biasa — tapi nilai yang dikembalikan itulah yang membuat trik-trik di bawah ini bisa dilakukan.

Trik nilai default: x or default

Karena or mengembalikan sisi pertama yang truthy, kamu bisa menyediakan nilai cadangan untuk sebuah nilai yang mungkin nil. Bayangkan sebuah nama yang mungkin kosong:

local typed_name = nil                 -- nothing was entered
local name = typed_name or "stranger"
print("Hello, " .. name)               -- Hello, stranger

Kalau typed_name berisi nilai yang sebenarnya, name akan tetap memakai nilai itu. Baris x or default ini adalah cara standar Lua untuk kembali ke nilai default — kamu akan melihatnya di mana saja ketika sebuah nilai mungkin tidak ada.

Buka exercises/17/01-default.lua. chosen disetel ke nil. Gunakan chosen or "rock" untuk kembali ke "rock", lalu cetak hasilnya. Setel chosen ke sebuah kata yang nyata dan jalankan lagi.

Short-circuit: sisi kedua dilewati

and dan or bersifat malas. Mereka berhenti begitu jawabannya sudah pasti:

  • a and b — jika a falsy, b tidak pernah dilihat sama sekali.
  • a or b — jika a truthy, b tidak pernah dilihat.

Ini membuat pengujian pertama bisa menjaga pengujian kedua, yang hanya dijalankan setelah yang pertama berhasil:

local total = 90
local count = 0
-- the average is only worth working out when count is not zero,
-- so the count check guards the division
if count > 0 and total / count > 20 then
    print("high average")
else
    print("no average to show")
end

Karena count > 0 bernilai false, Lua tidak pernah mengevaluasi total / count — ia langsung short-circuit ke else. Pola if x > 0 and sesuatu-yang-memakai-x muncul terus-menerus.

not membalik truthiness

not mengubah nilai apa pun menjadi boolean yang sesungguhnya — true jika nilai asalnya falsy, false jika truthy:

print(not nil)      -- true
print(not 0)        -- false   (0 is truthy, so "not 0" is false)
print(not false)    -- true

Ini berguna untuk menanyakan "apakah ini tidak ada?":

local key = nil
if not key then
    print("You need a key.")
end

PR (Pekerjaan Rumah)

File PR ada di exercises/17/homework/.

Soal 1 — Warna default

Buka exercises/17/homework/01-default-colour.lua. fav menyimpan sebuah warna atau nil. Menggunakan or, setel colour ke fav, atau ke "blue" ketika fav bernilai nil, lalu cetak Your colour is <colour>. Jalankan sekali dengan fav = nil dan sekali dengan warna yang nyata.

Soal 2 — Tabel truthy

Buka exercises/17/homework/02-truthy.lua. Untuk setiap nilai berikut, cetak nilainya dan apakah nilai itu truthy, menggunakan not not value untuk mengubahnya menjadi boolean yang sesungguhnya: 0, "", nil, false, "hi". (Dua not membalik falsy→false→true dan truthy→true→... coba saja dan lihat hasilnya.)

Soal 3 — Pembagian terjaga

Buka exercises/17/homework/03-guarded.lua. Dua angka: total dan count (yang mungkin bernilai 0). Menggunakan and, cetak rata-rata total / count hanya ketika count lebih besar dari 0; jika tidak cetak no data. Uji dengan count disetel ke 0 dan ke angka yang nyata.

Tantangan — Nilai pertama yang ada

Buka exercises/17/homework/04-first-value.lua. Tiga variabel a, b, c masing-masing menyimpan sebuah string atau nil. Dalam satu baris menggunakan or, cetak yang pertama yang memiliki nilai, atau none jika ketiganya nil. Coba berbagai kombinasi nilai dan nil.

Macet atau sudah selesai? Buka halaman solusi PR.