Perulangan yang kita tulis sejauh ini selalu berjalan sampai selesai: for memproses seluruh Range, while menunggu kondisi bernilai false, dan loop menanti break. Kebutuhan nyata sering lebih rumit daripada itu: pencarian sebaiknya berhenti begitu barang ditemukan karena memeriksa sisa data hanya membuang waktu, dan pemrosesan data kotor sebaiknya melewati elemen kosong tanpa menjalankan logika utama. Rust menyediakan dua kata kunci pengendali laju untuk kebutuhan tersebut — break menghentikan seluruh perulangan lebih awal, sedangkan continue melewati sisa iterasi saat ini dan langsung melompat ke iterasi berikutnya. Pada Chapter ini kita akan membedah perilaku keduanya pada for, while, dan loop.

break untuk Berhenti Lebih Awal #

Ketika break dieksekusi, Rust menghentikan perulangan yang paling dalam di sekelilingnya seketika — sisa iterasi yang belum berjalan dibatalkan dan eksekusi melanjutkan ke statement tepat setelah blok perulangan. Perilaku ini menjadikan break alat utama pola pencarian: temukan satu hasil yang memenuhi syarat, lalu berhenti. Mari kita cari skor pertama yang lulus ambang batas 90 dari sebuah array nilai ujian:

rust
fn main() {
    let scores = [78, 92, 64, 95, 88];
    let mut first_passing = 0;

    for score in scores {
        if score >= 90 {
            first_passing = score;
            break;
        }
    }

    println!("Skor lulus pertama: {}", first_passing);
}

Output yang Dihasilkan:

text
Skor lulus pertama: 92

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 2 (let scores = [78, 92, 64, 95, 88];): array berisi lima nilai ujian dibuat; pencarian akan bergerak dari kiri ke kanan.
  2. Baris 3 (let mut first_passing = 0;): variabel penampung hasil diisi nilai awal 0 dan ditandai mut agar dapat diisi di dalam perulangan.
  3. Baris 5 (for score in scores {): iterasi pertama memeriksa 78; karena 78 >= 90 bernilai false, blok if dilewati dan iterasi berlanjut ke 92.
  4. Baris 6 (if score >= 90 {): pada iterasi kedua, 92 >= 90 bernilai true sehingga blok if dieksekusi.
  5. Baris 7 (first_passing = score;): nilai 92 disimpan sebagai hasil pencarian.
  6. Baris 8 (break;): perulangan dihentikan seketika — nilai 64, 95, dan 88 tidak pernah diperiksa karena hasil sudah ditemukan.
  7. Baris 12 (println!("Skor lulus pertama: {}", first_passing);): hasil pencarian dicetak setelah perulangan berakhir.

Tanpa break, perulangan akan terus berjalan sampai elemen terakhir dan nilai 95 yang juga memenuhi syarat akan menimpa first_passing — hasil akhirnya salah untuk pertanyaan “skor pertama”. break menjamin loop berhenti pada kecocokan pertama sekaligus menghemat kerja: tiga elemen terakhir tidak pernah disentuh.

continue untuk Melewati Iterasi #

break membatalkan seluruh sisa perulangan; continue jauh lebih selektif. Kata kunci ini melewati sisa statement pada iterasi saat ini dan langsung memindahkan eksekusi ke titik pemeriksaan iterasi berikutnya — pada for, berarti mengambil elemen selanjutnya; pada while, berarti mengevaluasi ulang kondisi. Mari kita gunakan continue untuk melewati pesanan berisi nol item:

rust
fn main() {
    let quantities = [12, 0, 7, 0, 9];

    for quantity in quantities {
        if quantity == 0 {
            println!("Melewati pesanan kosong.");
            continue;
        }
        println!("Memproses pesanan sebanyak {} item.", quantity);
    }
}

Output yang Dihasilkan:

text
Memproses pesanan sebanyak 12 item.
Melewati pesanan kosong.
Memproses pesanan sebanyak 7 item.
Melewati pesanan kosong.
Memproses pesanan sebanyak 9 item.

Mari kita bedah program di atas:

  1. Baris 2 (let quantities = [12, 0, 7, 0, 9];): array jumlah item per pesanan berisi dua pesanan kosong yang harus dilewati.
  2. Baris 4 (for quantity in quantities {): setiap iterasi mengikat satu nilai jumlah pesanan ke variabel quantity.
  3. Baris 5 (if quantity == 0 {): pemeriksaan penjaga (guard) menyaring pesanan kosong sebelum logika utama berjalan.
  4. Baris 6 (println!("Melewati pesanan kosong.");): pesan penanda dicetak agar operator tahu bahwa data tersebut disengaja dilewati, bukan hilang.
  5. Baris 7 (continue;): eksekusi melompat ke iterasi berikutnya — statement di bawah blok if tidak dieksekusi untuk nilai 0.
  6. Baris 9 (println!("Memproses pesanan sebanyak {} item.", quantity);): baris ini hanya berjalan untuk nilai yang bukan 0, yaitu 12, 7, dan 9.

Pola penjaga di awal blok — periksa kondisi pengecualian, continue, lalu lanjutkan dengan logika utama — mengurangi percabangan if/else bersarang di badan perulangan. Logika utama berada tepat di posisi paling terbaca tanpa indentasi tambahan.

Menggabungkan keduanya dalam Satu Skenario #

Program pengiriman gudang berikut menggabungkan kedua kata kunci: pesanan yang melebihi 6 item ditolak dengan continue, dan pengiriman berhenti total dengan break begitu kuota 10 item tercapai:

rust
fn main() {
    let orders = [3, 5, 2, 8, 4];
    let mut total = 0;

    for order in orders {
        if order > 6 {
            println!("Pesanan {} item ditolak: melebihi batas.", order);
            continue;
        }

        total += order;
        println!("Pesanan {} item diterima, total menjadi {}.", order, total);

        if total >= 10 {
            println!("Kuota gudang tercapai, pengiriman dihentikan.");
            break;
        }
    }
}

Output yang Dihasilkan:

text
Pesanan 3 item diterima, total menjadi 3.
Pesanan 5 item diterima, total menjadi 8.
Pesanan 2 item diterima, total menjadi 10.
Kuota gudang tercapai, pengiriman dihentikan.

Mari kita uraikan jalannya program:

  1. Baris 2–3 (let orders = ...; let mut total = 0;): daftar pesanan dan penghitung total yang akan diakumulasi disiapkan.
  2. Baris 6 (if order > 6 {): pesanan 8 ditolak lewat jalur ini; continue membuat 8 tidak pernah menambah total.
  3. Baris 11 (total += order;): setiap pesanan yang lolos penyaringan menambah total berjalan — 3, lalu 8, lalu 10.
  4. Baris 14 (if total >= 10 {): setelah pesanan ketiga diproses, total tepat mencapai 10, sehingga kondisi bernilai true.
  5. Baris 16 (break;): pengiriman dihentikan sebelum pesanan 4 sempat diperiksa; keluaran terakhir hanya empat baris meskipun array berisi lima pesanan.

Perhatikan urutan pernyataan pada output: pesanan 8 yang berada di urutan keempat dalam array sama sekali tidak muncul karena break terjadi lebih dulu pada pesanan 2. Kedua kata kunci mengubah laju perulangan pada titik yang berbeda — continue bekerja di level satu iterasi, break bekerja di level seluruh perulangan.

Ringkasan #

break menghentikan perulangan lebih awal dan melanjutkan eksekusi setelah blok perulangan, sedangkan continue melewatkan sisa iterasi saat ini dan berpindah ke iterasi berikutnya. Pola pencarian memakai break pada kecocokan pertama, pola penyaringan memakai continue sebagai penjaga di awal blok, dan keduanya sering digabungkan dalam satu perulangan. Kedua kata kunci hanya mengendalikan perulangan terdalam yang membungkusnya — batasan yang pembahasannya kita lanjutkan dengan label pada Chapter berikutnya.