Lewati ke konten

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.

fn main() {
for i in 1..=5 {
println!("{i}");
}
}

Output:

1
2
3
4
5
▶ Coba sendiri

1..=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.

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:

apel
pisang
ceri
▶ Coba sendiri

Bandingkan 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: apel
1: pisang
2: ceri
▶ Coba sendiri

Bagian (index, fruit) adalah pola (pattern) tuple: setiap putaran memberimu sepasang nilai, dan perulangannya memecah pasangan itu menjadi dua variabel untukmu.

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 10
▶ Coba sendiri

Perhatikan 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.

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 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
7 x 10 = 70
▶ Coba sendiri

Variabel 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.

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 2500
▶ Coba sendiri

Cara 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.

  • for item in range_or_collection { ... } adalah perulangan sehari-hari di Rust.
  • 1..=5 mencakup kedua ujung; 1..5 berhenti 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..=1 itu kosong. Pakai (1..=3).rev() untuk menghitung mundur, dan .step_by(n) untuk melompat.

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