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 printIni 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→ jikaafalsy, maka mengembalikana; jika tidak, mengembalikanb.a or b→ jikaatruthy, maka mengembalikana; jika tidak, mengembalikanb.
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, strangerKalau 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— jikaafalsy,btidak pernah dilihat sama sekali.a or b— jikaatruthy,btidak 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")
endKarena 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) -- trueIni berguna untuk menanyakan "apakah ini tidak ada?":
local key = nil
if not key then
print("You need a key.")
endPR (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.