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 ditulis tanpa kurung.
if (total >= 100000)tetap jalan, tapi dapat peringatanunnecessary parentheses around `if` condition. - Kurung kurawal
{ }wajib, walau isinya cuma satu baris. - Kondisi dicek dari atas. Cabang pertama yang benar dijalankan, sisanya dilewati.
elsemenangkap semua yang gak cocok, dan boleh gak ada. - Pembanding:
==sama dengan,!=tidak sama,<,>,<=,>=. Penggabung:&&(dan),||(atau),!(bukan), misalnyatotal >= 100000 && !member.
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
if total >= 100000 { 0 } else { 10000 }menghasilkan nilai cabang yang terpilih. 70000 belum sampai 100000, jadiongkirberisi10000.- Nilai di dalam cabang ditulis tanpa titik koma, sama seperti baris terakhir fungsi. Titik komanya ada di akhir baris
let. - Ini pengganti
kondisi ? a : bdi JavaScript. Rust gak punya operator? :, karenaifsudah bisa menghasilkan nilai.
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
- Kondisi bukan bool.
if porsiditolak. Tulisif porsi > 0. - Cabang beda tipe. Semua cabang
ifyang hasilnya dipakai harus menghasilkan tipe yang sama. - Titik koma di dalam cabang.
if total >= 100000 { 0; } else { 10000 }ditolak denganexpected `()`, found integer:0;sudah jadi statement. - Urutan terbalik. Kondisi yang lebih longgar di atas menelan kondisi yang lebih ketat di bawahnya.
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.