Perulangan loop pada Chapter sebelumnya berjalan tanpa henti dan hanya berhenti ketika break dieksekusi di dalam blok. Banyak kasus lain yang polanya lebih sederhana: “ulangi selama kondisi ini masih benar” — misalnya terus tampilkan sisa bahan bakar selama tangki belum kosong, atau terus proses pesanan selama stok masih mencukupi. Kata kunci while di Rust mengurus pola tersebut dengan cara memeriksa kondisi di depan setiap iterasi, tanpa memerlukan break di dalam blok. Pada Chapter ini kita akan mempelajari mekanisme while, cara kerjanya di balik layar, dan jebakan yang paling sering menghadang pemula.
Sintaks while #
Bentuk while hampir sama dengan if: kata kunci, kondisi bertipe bool tanpa tanda kurung, lalu blok kurung kurawal. Perbedaannya terletak pada pengulangan. Sebelum setiap iterasi, Rust mengevaluasi kondisi terlebih dahulu. Apabila hasilnya true, blok dieksekusi satu kali penuh, lalu kondisi diperiksa ulang dari awal. Apabila hasilnya false, perulangan berhenti dan eksekusi melanjutkan ke statement setelah blok while. Mari kita lihat pada program hitung mundur bahan bakar:
fn main() {
let mut fuel = 5;
while fuel > 0 {
println!("Sisa bahan bakar: {} liter", fuel);
fuel -= 1;
}
println!("Bahan bakar habis.");
}Output yang Dihasilkan:
Sisa bahan bakar: 5 liter
Sisa bahan bakar: 4 liter
Sisa bahan bakar: 3 liter
Sisa bahan bakar: 2 liter
Sisa bahan bakar: 1 liter
Bahan bakar habis.Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 2 (
let mut fuel = 5;): variabelfueldiawali dengan5dan ditandaimutkarena isinya akan dikurangi di dalam perulangan. - Baris 4 (
while fuel > 0 {): Rust membandingkanfuel > 0sebelum setiap iterasi; selama hasilnyatrue, blok di bawahnya dieksekusi lagi. - Baris 5 (
println!("Sisa bahan bakar: {} liter", fuel);): macroprintln!mencetak sisa bahan bakar pada awal iterasi, sehingga angka yang tampil dimulai dari5turun sampai1. - Baris 6 (
fuel -= 1;): nilaifuelberkurang satu pada setiap iterasi — baris inilah yang membuat kondisifuel > 0akhirnya bernilaifalseketikafuelmencapai0. - Baris 9 (
println!("Bahan bakar habis.");): statement setelah blokwhilehanya tercapai setelah pemeriksaan kondisi menghasilkanfalsepada nilaifuel = 0.
Pola pemeriksaan “cek dulu, baru jalan” disebut pre-test loop: kondisi selalu dievaluasi sebelum iterasi pertama, sehingga apabila kondisi sudah bernilai false sejak awal, blok while tidak dieksekusi sama sekali. Contohnya, let fuel = 0; pada baris 2 membuat program hanya mencetak Bahan bakar habis. tanpa satu baris pun dari isi perulangan.
Memproses Data Sampai Batas Tercapai #
Contoh berikutnya menunjukkan while yang langkahnya lebih besar dari satu. Sebuah gudang memproses pesanan yang masing-masing menghabiskan 4 unit stok, dan pengolahan berhenti ketika stok tersisa kurang dari 4 unit. Kondisi berhenti dihitung langsung dari nilai variabel, bukan dari penghitung iterasi:
fn main() {
let mut stock = 12;
while stock >= 4 {
println!("Memproses pesanan, sisa stok {}", stock);
stock -= 4;
}
println!("Stok akhir: {}", stock);
}Output yang Dihasilkan:
Memproses pesanan, sisa stok 12
Memproses pesanan, sisa stok 8
Memproses pesanan, sisa stok 4
Stok akhir: 0Mari kita uraikan alur program di atas:
- Baris 2 (
let mut stock = 12;): stok gudang dimulai dari12unit. - Baris 4 (
while stock >= 4 {): perulangan berjalan selama stok masih cukup untuk satu pesanan;12 >= 4bernilaitruesehingga iterasi pertama dimulai. - Baris 5 (
println!("Memproses pesanan, sisa stok {}", stock);): program mencetak stok sebelum pesanan diproses, sehingga tampilan dimulai dari12, lalu8, lalu4. - Baris 6 (
stock -= 4;): setiap pesanan mengurangi stok sebanyak4unit —12menjadi8,8menjadi4, dan4menjadi0. - Baris 9 (
println!("Stok akhir: {}", stock);): ketikastockbernilai0, pemeriksaan0 >= 4menghasilkanfalse, perulangan berhenti, dan stok akhir dicetak.
Perhatikan bahwa variabel stock berperan ganda: sebagai data yang diproses dan sebagai penentu kondisi perulangan. Pola seperti ini sangat umum pada pemrosesan bertahap, misalnya memotong kayu dari balok panjang sampai sisanya kurang dari ukuran yang dibutuhkan.
Jebakan Kondisi yang Tidak Pernah Berubah #
Syarat mutlak agar while berhenti adalah isi blok harus mengubah sesuatu yang memengaruhi kondisi, baik variabel pada kondisi itu sendiri maupun kondisi pembacaan data dari luar. Apabila blok tidak mengubah apa pun yang dipakai kondisi, hasilnya adalah infinite loop — program terus mengulang blok yang sama selamanya. Kembali ke contoh bahan bakar: menghapus baris fuel -= 1; membuat fuel selamanya bernilai 5, kondisi fuel > 0 selamanya true, dan terminal terus dicetak baris Sisa bahan bakar: 5 liter tanpa henti.
Kesalahan sejenis juga muncul lewat kesalahan arah perubahan. Variabel yang seharusnya berkurang justru bertambah (stock += 4 alih-alih stock -= 4) tidak akan pernah membuat kondisi stock >= 4 bernilai false. Compiler tidak dapat membantu untuk kasus ini karena kode tersebut sah secara tipe; hanya penelusuran manual logika perulangan yang dapat menemukannya.
Memilih antara while dan loop #
Kedua kata kunci tersebut sama-sama mampu menulis perulangan apa pun — loop dengan break bersyarat dapat meniru while, dan while dapat menjadi infinite loop dengan kondisi true. Pilihan kita sebaiknya mengikuti letak titik keputusan berhenti:
| Situasi | Pilihan yang pas | Alasan |
|---|---|---|
| Kondisi berhenti sudah bisa diperiksa sebelum setiap iterasi | while | Kondisi tertulis di awal, terbaca sebagai kontrak perulangan |
| Keputusan berhenti muncul di tengah blok | loop + break | break dapat ditempatkan persis di titik keputusan |
| Perulangan harus menghasilkan nilai | loop + break nilai | Hanya loop yang mendukung break bernilai |
| Jumlah iterasi atau rentang nilainya sudah diketahui | for | Bentuk paling ringkas, dibahas pada Chapter for dan Range |
Ringkasan #
Perulangan while mengevaluasi kondisi bertipe bool sebelum setiap iterasi dan hanya mengeksekusi blok ketika hasilnya true. Blok yang baik selalu mengubah sesuatu yang dipakai kondisi agar perulangan mencapai titik berhenti. Pilihan antara while dan loop mengikuti letak keputusan berhenti: kondisi di depan untuk while, keputusan di tengah proses untuk loop. Berikutnya kita akan bertemu bentuk perulangan yang paling sering dipakai programmer Rust sehari-hari: for dengan Range.