If/Else di Rust — Rust

Percabangan: if/else di Rust Rust menggunakan if, else if, dan else untuk percabangan. Tidak perlu kurung () pada kondisi, tapi kurung kurawal {} wajib…

if memilih jalan berdasarkan kondisi yang bernilai benar atau salah. Di Rust, if juga sebuah expression: ia menghasilkan nilai dari cabang yang terpilih, jadi bisa langsung disimpan di variabel. Bayangin kasir Kedai Martabak Bang Rusdi menghitung ongkos kirim. Belanja Rp100.000 ke atas, ongkirnya gratis. Di bawah itu, ongkirnya Rp10.000. Cuma satu aturan yang berlaku untuk tiap pesanan, dan hasilnya selalu berupa nominal rupiah yang ditulis di struk. Kondisinya itu total >= 100000, kedua aturan itu cabang if dan else, dan nominal di struk itu nilai yang dihasilkan if.

🧪 Tebakan cepat: kasir ingin struknya menulis kata "gratis": let ongkir = if total >= 100000 { "gratis" } else { 10000 };. Apakah kode ini lolos compile? Tebak dulu, jawabannya ada di bagian "Kedua cabang harus setipe".

if, else if, else

fn main() {
    let total: u32 = 32000 * 2 + 38000 * 1;
    if total >= 100000 {
        println!("Gratis ongkir");
    } else if total >= 50000 {
        println!("Ongkir 5000");
    } else {
        println!("Ongkir 10000");
    }
}

Dua martabak manis dan satu martabak telur totalnya 102000, jadi output-nya Gratis ongkir.

Kondisi harus bool

Di JavaScript, if (porsi) jalan untuk angka selain 0. Di Rust, kondisi harus bertipe bool:

error[E0308]: mismatched types
 --> src/main.rs:3:8
  |
3 |     if porsi {
  |        ^^^^^ expected `bool`, found `u32`

Tulis perbandingannya terang-terangan: if porsi > 0. Hal yang sama terjadi kalau kamu salah menulis = (mengisi) untuk == (membandingkan): if porsi = 2 ditolak dengan expected `bool`, found `()` dan saran you might have meant to compare for equality.

if sebagai expression

fn main() {
    let total: u32 = 32000 * 1 + 38000 * 1;
    let ongkir = if total >= 100000 { 0 } else { 10000 };
    println!("Belanja: {}", total);
    println!("Ongkir: {}", ongkir);
    println!("Bayar: {}", total + ongkir);
}
Belanja: 70000
Ongkir: 10000
Bayar: 80000

Kedua cabang harus setipe

ongkir cuma boleh punya satu tipe. Kalau satu cabang menghasilkan teks dan cabang lain angka, compiler gak bisa memilih:

error[E0308]: `if` and `else` have incompatible types
 --> src/main.rs:3:57
  |
3 |     let ongkir = if total >= 100000 { "gratis" } else { 10000 };
  |                                       --------          ^^^^^ expected `&str`, found integer
  |                                       |
  |                                       expected because of this

Cabang pertama menentukan tipenya (&str), lalu cabang kedua (angka) ditolak. Itu jawaban tebakannya: gak lolos. Pakai 0 di cabang pertama, lalu tulis kata "gratis" saat mencetak. Begitu juga, if yang hasilnya disimpan wajib punya else: let ongkir = if total >= 100000 { 0 }; ditolak dengan error[E0317]: `if` may be missing an `else` clause, karena tanpa else gak ada nilai saat kondisinya salah.

Urutan kondisi menentukan hasil

Fungsi juga bisa mengembalikan teks yang ditulis langsung di kode. Tipe hasilnya &'static str: teks tetap yang hidup selama program jalan.

fn label_ongkir(total: u32) -> &'static str {
    if total >= 50000 {
        "murah"
    } else if total >= 100000 {
        "gratis"
    } else {
        "normal"
    }
}

fn main() {
    println!("{}", label_ongkir(102000));
}

Output-nya murah, padahal belanja 102000 seharusnya gratis. 102000 sudah lolos >= 50000 di cabang pertama, jadi cabang >= 100000 gak pernah dicek. Cabang itu gak akan pernah terpilih, dan compiler gak memperingatkannya. Cek dari batas tertinggi dulu: >= 100000, lalu >= 50000, lalu else.

⚠️ Jebakan yang sering ketemu

TL;DR: if kondisi { } else if kondisi { } else { } dicek dari atas, dan cabang pertama yang benar menang. Kondisi ditulis tanpa kurung, wajib bertipe bool (gak ada truthy seperti JavaScript), dan kurung kurawal wajib. if adalah expression: let ongkir = if total >= 100000 { 0 } else { 10000 }; menyimpan nilai cabang yang terpilih. Semua cabangnya harus setipe (`if` and `else` have incompatible types), wajib punya else, dan nilainya ditulis tanpa titik koma. Fungsi yang mengembalikan teks tetap bertipe &'static str. Urutkan kondisi dari batas tertinggi.

Yang akan kamu pelajari