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:
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:
Skor lulus pertama: 92Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 2 (
let scores = [78, 92, 64, 95, 88];): array berisi lima nilai ujian dibuat; pencarian akan bergerak dari kiri ke kanan. - Baris 3 (
let mut first_passing = 0;): variabel penampung hasil diisi nilai awal0dan ditandaimutagar dapat diisi di dalam perulangan. - Baris 5 (
for score in scores {): iterasi pertama memeriksa78; karena78 >= 90bernilaifalse, blokifdilewati dan iterasi berlanjut ke92. - Baris 6 (
if score >= 90 {): pada iterasi kedua,92 >= 90bernilaitruesehingga blokifdieksekusi. - Baris 7 (
first_passing = score;): nilai92disimpan sebagai hasil pencarian. - Baris 8 (
break;): perulangan dihentikan seketika — nilai64,95, dan88tidak pernah diperiksa karena hasil sudah ditemukan. - 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:
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:
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:
- Baris 2 (
let quantities = [12, 0, 7, 0, 9];): array jumlah item per pesanan berisi dua pesanan kosong yang harus dilewati. - Baris 4 (
for quantity in quantities {): setiap iterasi mengikat satu nilai jumlah pesanan ke variabelquantity. - Baris 5 (
if quantity == 0 {): pemeriksaan penjaga (guard) menyaring pesanan kosong sebelum logika utama berjalan. - Baris 6 (
println!("Melewati pesanan kosong.");): pesan penanda dicetak agar operator tahu bahwa data tersebut disengaja dilewati, bukan hilang. - Baris 7 (
continue;): eksekusi melompat ke iterasi berikutnya — statement di bawah blokiftidak dieksekusi untuk nilai0. - Baris 9 (
println!("Memproses pesanan sebanyak {} item.", quantity);): baris ini hanya berjalan untuk nilai yang bukan0, yaitu12,7, dan9.
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:
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:
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:
- Baris 2–3 (
let orders = ...; let mut total = 0;): daftar pesanan dan penghitung total yang akan diakumulasi disiapkan. - Baris 6 (
if order > 6 {): pesanan8ditolak lewat jalur ini;continuemembuat8tidak pernah menambahtotal. - Baris 11 (
total += order;): setiap pesanan yang lolos penyaringan menambah total berjalan —3, lalu8, lalu10. - Baris 14 (
if total >= 10 {): setelah pesanan ketiga diproses, total tepat mencapai10, sehingga kondisi bernilaitrue. - Baris 16 (
break;): pengiriman dihentikan sebelum pesanan4sempat 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.