Lewati ke konten

Boolean di Rust

Boolean adalah tipe paling sederhana yang ada: nilainya hanya bisa true (benar) atau false (salah). Di Rust, tipe ini bernama bool, dan kamu akan memakainya setiap kali kode kamu perlu mengambil keputusan.

fn main() {
let is_active = true;
let has_error: bool = false;
println!("aktif: {is_active}, error: {has_error}");
}
▶ Coba sendiri

Rust hampir selalu bisa menebak sendiri bahwa sebuah nilai bertipe bool dari true/false, jadi kamu jarang perlu menuliskan tipenya.

Boolean biasanya berasal dari perbandingan

Section titled “Boolean biasanya berasal dari perbandingan”

Di kode sungguhan, kamu jarang menulis true atau false secara langsung. Biasanya nilai itu muncul dari hasil membandingkan sesuatu:

fn main() {
let age = 20;
let can_vote = age >= 18;
println!("Boleh memilih: {can_vote}");
}

Output:

Boleh memilih: true
▶ Coba sendiri

Tugas utama sebuah bool adalah menentukan cabang if mana yang dijalankan:

fn main() {
let is_raining = true;
if is_raining {
println!("Bawa payung");
} else {
println!("Tinggalkan saja di rumah");
}
}

Kita akan membahas if secara lengkap di halaman If…Else. Ini baru sekilas untuk menunjukkan kenapa boolean itu penting.

Kamu sudah bertemu && (dan), || (atau), dan ! (bukan) di halaman Operator. Ada satu hal lagi yang perlu kamu tahu: operator ini berhenti lebih awal begitu jawabannya sudah pasti. Ini disebut short-circuit evaluation (evaluasi hubung-singkat).

  • Pada a && b, kalau a bernilai false, hasil keseluruhannya pasti false, jadi Rust tidak pernah melihat b.
  • Pada a || b, kalau a bernilai true, hasil keseluruhannya pasti true, jadi Rust tidak pernah melihat b.

Ini bukan sekadar trik supaya lebih cepat. Dengan cara ini, sisi kiri bisa melindungi sisi kanan:

fn main() {
let count = 0;
let total = 50;
// count bernilai 0, jadi Rust berhenti setelah `count != 0` dan tidak pernah membagi.
let big_average = count != 0 && total / count > 10;
println!("rata-rata besar: {big_average}");
let is_weekend = true;
let has_homework = true;
// is_weekend bernilai true, jadi `!has_homework` tidak pernah dicek.
let can_relax = is_weekend || !has_homework;
println!("bisa santai: {can_relax}");
}

Output:

rata-rata besar: false
bisa santai: true
▶ Coba sendiri

Membagi dengan nol akan membuat program crash. Karena count != 0 ada di depan dan bernilai false, pembagiannya tidak pernah dijalankan. Kalau kedua sisinya kamu tukar (total / count > 10 && count != 0), pembagian akan jalan lebih dulu. Di contoh ini, compiler bahkan langsung menyadarinya dan menolak untuk build (“this operation will panic at runtime”, artinya operasi ini akan panic saat program berjalan). Kalau nilainya baru diketahui saat program berjalan, programnya akan crash. Jadi, taruh “pengecekan keamanan” di sebelah kiri.

Sebuah wahana di taman hiburan membolehkan kamu naik kalau tinggimu minimal 120 cm, atau kalau umurmu minimal 8 tahun dan naik bersama orang dewasa. Simpan tinggi 115, umur 9, dan with_adult = true, lalu tampilkan apakah anak ini boleh naik. Petunjuk: pakai tanda kurung untuk mengelompokkan bagian “umur dan orang dewasa”.

Lihat solusi
fn main() {
let height_cm = 115;
let age = 9;
let with_adult = true;
let tall_enough = height_cm >= 120;
let can_ride = tall_enough || (age >= 8 && with_adult);
println!("cukup tinggi: {tall_enough}");
println!("boleh naik: {can_ride}");
}

Output:

cukup tinggi: false
boleh naik: true
▶ Coba sendiri

Sebuah tahun adalah tahun kabisat kalau habis dibagi 4 tapi tidak habis dibagi 100, atau kalau habis dibagi 400. Hitung boolean is_leap untuk tahun 2024, tampilkan, lalu lakukan hal yang sama untuk 1900. Petunjuk: “habis dibagi 4” ditulis year % 4 == 0, dan kamu bisa melakukan shadowing pada year dan is_leap dengan let kedua.

Lihat solusi
fn main() {
let year = 2024;
let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
println!("{year} tahun kabisat: {is_leap}");
let year = 1900;
let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
println!("{year} tahun kabisat: {is_leap}");
}

Output:

2024 tahun kabisat: true
1900 tahun kabisat: false
▶ Coba sendiri
  • bool hanya punya dua nilai: true atau false.
  • Perbandingan (==, <, >=, …) menghasilkan boolean.
  • Kondisi di if harus benar-benar bool. Tidak ada konversi otomatis dari angka atau string.
  • && dan || melakukan short-circuit: sisi kanan dilewati begitu jawabannya sudah pasti, jadi taruh pengecekan keamanan di sebelah kiri.

Kuis singkat

1. Tipe apa yang dihasilkan oleh perbandingan seperti age >= 18?

2. Di Rust, bisakah kamu memakai bilangan bulat seperti 0 langsung sebagai kondisi if, seperti di beberapa bahasa lain?

3. Pada count != 0 && total / count > 10, apa yang terjadi kalau count bernilai 0?

Skor: 0 / 3