17. Logika boolean lebih dalam — Solusi PR

File solusi .lua ada di exercises/17/homework/solutions/.

Soal 1 — Warna default

Soal. Gunakan "blue" sebagai cadangan ketika fav bernilai nil.

Solusi.

local fav = nil                  -- try a real colour here too
local colour = fav or "blue"
print("Your colour is " .. colour)

Dengan fav = nil hasilnya Your colour is blue; dengan fav = "red" hasilnya Your colour is red.

Kesalahan umum.

  • Menulis if fav == nil then colour = "blue" else colour = fav end. Benar, tapi fav or "blue" adalah idiom yang lebih singkat dan layak untuk diketahui.

Soal 2 — Tabel truthy

Soal. Tampilkan apakah setiap nilai bersifat truthy menggunakan not not value.

Cara memikirkannya. Satu not menghasilkan boolean yang berlawanan; not kedua membaliknya lagi, sehingga menghasilkan boolean yang sesuai dengan sifat truthy nilai tersebut.

Solusi.

print(0, not not 0)         -- 0      true
print("", not not "")       --        true
print(nil, not not nil)     -- nil    false
print(false, not not false) -- false  false
print("hi", not not "hi")   -- hi     true

Dua hal yang mengejutkan adalah 0 dan "": keduanya truthy di Lua.

Soal 3 — Pembagian dengan pengaman

Soal. Cetak rata-rata hanya ketika count lebih dari nol.

Solusi.

local total = 90
local count = 0                  -- try a real number too

if count > 0 and total / count > 0 then
    print("Average: " .. (total / count))
else
    print("no data")
end

Dengan count = 0, pengecekan count > 0 bernilai false, sehingga Lua melakukan short-circuit dan melewati pembagian, mencetak no data. Dengan count = 3 hasilnya Average: 30.0.

Kesalahan umum.

  • Menulis if total / count ... tanpa pengaman count > 0. Pembagian kemudian tetap berjalan meski count bernilai 0 — dengan pembagian integer itu adalah error. Pengaman mencegah hal itu terjadi.

Tantangan — Nilai pertama yang ada

Soal. Cetak yang pertama dari a, b, c yang bukan nil.

Solusi.

local a = nil
local b = nil
local c = "third"

print(a or b or c or "none")     -- third

or berjalan dari kiri ke kanan dan mengembalikan nilai truthy pertama yang ditemukan, sehingga rantai ini berhenti pada variabel pertama yang berisi sesuatu. Jika ketiganya nil, ia mengembalikan "none" di akhir.

Kesalahan umum.

  • Membuat rangkaian if/elseif panjang yang mengecek setiap variabel untuk nil. Benar, tapi rantai or melakukannya dalam satu baris.

Selesai?

Sekarang kamu sudah tahu bahwa and/or mengembalikan nilai, melakukan short-circuit, dan menggerakkan trik x or default. Berikutnya adalah Perulangan, cara lain untuk membuat program melakukan lebih dari satu hal yang sama berulang kali.