For di Rust
for berjalan melewati sebuah range atau koleksi, satu item setiap kali. Dari tiga jenis perulangan (loop) di Rust, inilah yang paling sering akan kamu pakai.
Perulangan pada range
Section titled “Perulangan pada range”fn main() { for i in 1..=5 { println!("{i}"); }}Output:
123451..=5 adalah sebuah range (rentang) yang mencakup kedua ujungnya (1 sampai 5). Kalau kamu menghapus = menjadi 1..5, range-nya berhenti satu angka lebih awal, jadi kamu hanya mendapat 1 sampai 4. Selisih satu ini gampang bikin salah, jadi ada baiknya kamu cek lagi mana yang sebenarnya kamu maksud.
Perulangan pada koleksi
Section titled “Perulangan pada koleksi”Di sinilah for benar-benar unggul: menelusuri sebuah array atau vektor tanpa harus melacak indeks sendiri.
fn main() { let fruits = ["apel", "pisang", "ceri"];
for fruit in fruits { println!("{fruit}"); }}Output:
apelpisangceriBandingkan dengan menghitung manual memakai perulangan while dan indeks (fruits[i]): versi for lebih pendek, dan tidak ada indeks yang bisa salah. Kamu akan belajar lebih banyak tentang array dan vektor di halaman Array dan Vektor.
Mendapatkan indeksnya juga dengan .enumerate()
Section titled “Mendapatkan indeksnya juga dengan .enumerate()”Kalau kamu butuh posisi sekaligus nilainya, pakai .enumerate():
fn main() { let fruits = ["apel", "pisang", "ceri"];
for (index, fruit) in fruits.iter().enumerate() { println!("{index}: {fruit}"); }}Output:
0: apel1: pisang2: ceriBagian (index, fruit) adalah pola (pattern) tuple: setiap putaran memberimu sepasang nilai, dan perulangannya memecah pasangan itu menjadi dua variabel untukmu.
Menghitung mundur dan melompat
Section titled “Menghitung mundur dan melompat”Bagaimana kalau kamu ingin menghitung mundur dari 3, atau hanya mengunjungi setiap angka kedua? Percobaan pertama yang terasa wajar adalah range yang terbalik, seperti 3..=1. Kode itu bisa dikompilasi, tapi perulangannya tidak pernah berjalan. Range hanya menghitung naik, jadi range yang awalnya lebih besar dari akhirnya pasti kosong.
Sebagai gantinya, pakai range biasa lalu ubah cara kamu menelusurinya:
.rev()menelusuri range dari belakang..step_by(n)mengambil setiap nilai ke-n, dimulai dari yang pertama.
fn main() { for i in (1..=3).rev() { println!("{i}..."); } println!("Mulai!");
for even in (0..=10).step_by(2) { print!("{even} "); } println!();
for i in 3..=1 { println!("ini tidak pernah dicetak: {i}"); }}Output:
3...2...1...Mulai!0 2 4 6 8 10Perhatikan tanda kurungnya: (1..=3).rev(). Tanpa kurung, Rust akan membaca 1..=3.rev() sebagai “1 sampai 3.rev()”, dan itu bukan yang kamu mau. Kamu juga bisa menggabungkan keduanya: (0..=10).rev().step_by(5) menghasilkan 10, 5, 0.
Kenapa for lebih disukai daripada while untuk menghitung
Section titled “Kenapa for lebih disukai daripada while untuk menghitung”Kamu bisa menulis perulangan hitungan dengan while, tapi for dengan range menghilangkan satu kategori kesalahan sekaligus: tidak ada penghitung manual yang bisa lupa diperbarui, dan tidak ada risiko berjalan satu langkah melewati ujung array. Programmer Rust memakai for secara default dan hanya memakai while kalau tidak ada range atau koleksi yang cocok untuk ditelusuri.
Latihan
Section titled “Latihan”1. Tabel perkalian
Section titled “1. Tabel perkalian”Cetak tabel perkalian 7 dari 7 x 1 = 7 sampai 7 x 10 = 70. Petunjuk: satu perulangan for pada 1..=10 sudah cukup. Kamu bisa langsung melakukan perkaliannya di dalam println!.
Lihat solusi
fn main() { for i in 1..=10 { println!("7 x {i} = {}", 7 * i); }}Output:
7 x 1 = 77 x 2 = 147 x 3 = 217 x 4 = 287 x 5 = 357 x 6 = 427 x 7 = 497 x 8 = 567 x 9 = 637 x 10 = 70Variabel bernama seperti {i} bisa langsung ditulis di dalam kurung kurawal. Perhitungan seperti 7 * i tidak bisa, jadi kita pakai {} kosong dengan nilainya ditulis setelah koma.
2. Jumlahkan bilangan ganjil
Section titled “2. Jumlahkan bilangan ganjil”Jumlahkan semua bilangan ganjil dari 1 sampai 99 lalu cetak totalnya. Petunjuk: (1..100).step_by(2) memberimu 1, 3, 5, … 99. Simpan total mut di luar perulangan.
Lihat solusi
fn main() { let mut total = 0;
for n in (1..100).step_by(2) { total += n; }
println!("Jumlah bilangan ganjil dari 1 sampai 99 adalah {total}");}Output:
Jumlah bilangan ganjil dari 1 sampai 99 adalah 2500Cara lain adalah menelusuri 1..100 dan hanya menambahkan n kalau n % 2 == 1. Keduanya benar. step_by hanya melewati bilangan genap, bukannya mengecek setiap angka satu per satu.
Ringkasan
Section titled “Ringkasan”for item in range_or_collection { ... }adalah perulangan sehari-hari di Rust.1..=5mencakup kedua ujung;1..5berhenti satu angka sebelum 5.- Telusuri array/vektor secara langsung untuk mendapatkan setiap nilai tanpa indeks manual.
- Pakai
.enumerate()kalau kamu butuh indeks di samping nilainya. - Range terbalik seperti
3..=1itu kosong. Pakai(1..=3).rev()untuk menghitung mundur, dan.step_by(n)untuk melompat.
Kuis singkat
Section titled “Kuis singkat”Kuis singkat
1. Apa bedanya 1..=5 dan 1..5 di perulangan for?
2. Bagaimana cara mendapatkan indeks sekaligus nilai saat menelusuri sebuah koleksi?
3. Kenapa for umumnya lebih disukai daripada while untuk menelusuri sebuah koleksi?
4. Apa yang dilakukan for i in 5..=1 { ... }?
Skor: 0 / 4
Bacaan lebih lanjut
Section titled “Bacaan lebih lanjut”- Looping Through a Collection with for — The Rust Book (bahasa Inggris): pengenalan resmi, termasuk hitung mundur dengan
.rev(). - for and range — Rust by Example (bahasa Inggris): contoh range yang bisa dijalankan, plus
iter,iter_mut, daninto_iteruntuk koleksi. - Iterator loops — The Rust Reference (bahasa Inggris): aturan persis tentang apa yang dilakukan perulangan
fordi balik layar. Iterator::step_by— dokumentasi standard library (bahasa Inggris): cara kerjastep_by, lengkap dengan contoh.revdidokumentasikan di halaman yang sama.