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:

rust
fn main() {
    let mut fuel = 5;

    while fuel > 0 {
        println!("Sisa bahan bakar: {} liter", fuel);
        fuel -= 1;
    }

    println!("Bahan bakar habis.");
}

Output yang Dihasilkan:

text
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:

  1. Baris 2 (let mut fuel = 5;): variabel fuel diawali dengan 5 dan ditandai mut karena isinya akan dikurangi di dalam perulangan.
  2. Baris 4 (while fuel > 0 {): Rust membandingkan fuel > 0 sebelum setiap iterasi; selama hasilnya true, blok di bawahnya dieksekusi lagi.
  3. Baris 5 (println!("Sisa bahan bakar: {} liter", fuel);): macro println! mencetak sisa bahan bakar pada awal iterasi, sehingga angka yang tampil dimulai dari 5 turun sampai 1.
  4. Baris 6 (fuel -= 1;): nilai fuel berkurang satu pada setiap iterasi — baris inilah yang membuat kondisi fuel > 0 akhirnya bernilai false ketika fuel mencapai 0.
  5. Baris 9 (println!("Bahan bakar habis.");): statement setelah blok while hanya tercapai setelah pemeriksaan kondisi menghasilkan false pada nilai fuel = 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:

rust
fn main() {
    let mut stock = 12;

    while stock >= 4 {
        println!("Memproses pesanan, sisa stok {}", stock);
        stock -= 4;
    }

    println!("Stok akhir: {}", stock);
}

Output yang Dihasilkan:

text
Memproses pesanan, sisa stok 12
Memproses pesanan, sisa stok 8
Memproses pesanan, sisa stok 4
Stok akhir: 0

Mari kita uraikan alur program di atas:

  1. Baris 2 (let mut stock = 12;): stok gudang dimulai dari 12 unit.
  2. Baris 4 (while stock >= 4 {): perulangan berjalan selama stok masih cukup untuk satu pesanan; 12 >= 4 bernilai true sehingga iterasi pertama dimulai.
  3. Baris 5 (println!("Memproses pesanan, sisa stok {}", stock);): program mencetak stok sebelum pesanan diproses, sehingga tampilan dimulai dari 12, lalu 8, lalu 4.
  4. Baris 6 (stock -= 4;): setiap pesanan mengurangi stok sebanyak 4 unit — 12 menjadi 8, 8 menjadi 4, dan 4 menjadi 0.
  5. Baris 9 (println!("Stok akhir: {}", stock);): ketika stock bernilai 0, pemeriksaan 0 >= 4 menghasilkan false, 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:

SituasiPilihan yang pasAlasan
Kondisi berhenti sudah bisa diperiksa sebelum setiap iterasiwhileKondisi tertulis di awal, terbaca sebagai kontrak perulangan
Keputusan berhenti muncul di tengah blokloop + breakbreak dapat ditempatkan persis di titik keputusan
Perulangan harus menghasilkan nilailoop + break nilaiHanya loop yang mendukung break bernilai
Jumlah iterasi atau rentang nilainya sudah diketahuiforBentuk 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.