Lewati ke konten

Array di Rust

Array adalah daftar nilai berukuran tetap, dan semua nilainya bertipe sama. “Berukuran tetap” adalah kata kuncinya: begitu kamu membuat sebuah array, ukurannya tidak bisa bertambah atau berkurang. Kalau kamu butuh sesuatu yang ukurannya bisa berubah, gunakan vektor.

fn main() {
let numbers: [i32; 5] = [1, 2, 3, 4, 5];
println!("{:?}", numbers);
}

Tipe [i32; 5] dibaca “array berisi 5 nilai i32.” Panjang itu adalah bagian dari tipenya: [i32; 5] dan [i32; 3] dianggap tipe yang berbeda.

▶ Coba sendiri

Kamu juga bisa membiarkan Rust menebak tipenya dan cukup menulis nilainya:

let numbers = [1, 2, 3, 4, 5];

Untuk mengisi array dengan nilai yang sama sebanyak N kali, pakai cara singkat ini:

fn main() {
let zeros = [0; 5]; // [0, 0, 0, 0, 0]
println!("{:?}", zeros);
}
▶ Coba sendiri

Indeks array dimulai dari 0, dan ditulis dengan kurung siku:

fn main() {
let fruits = ["apel", "pisang", "ceri"];
println!("{}", fruits[0]); // apel
println!("{}", fruits[2]); // ceri
println!("Panjang: {}", fruits.len());
}
▶ Coba sendiri

Coba akses indeks yang tidak ada, dan Rust akan menghentikan programmu alih-alih diam-diam membaca memori sampah:

fn get_fruit(fruits: [&str; 3], index: usize) -> &str {
fruits[index]
}
fn main() {
let fruits = ["apel", "pisang", "ceri"];
println!("{}", get_fruit(fruits, 10)); // panic saat program berjalan
}
thread 'main' (12345) panicked at src/main.rs:2:5:
index out of bounds: the len is 3 but the index is 10

Pesan dari Rust ini artinya: indeks di luar batas, panjangnya 3 tapi indeksnya 10.

fn main() {
let numbers = [10, 20, 30];
for n in numbers {
println!("{n}");
}
}
▶ Coba sendiri

Sebuah array bisa berisi array lain. Hasilnya adalah sebuah grid dengan baris dan kolom, seperti papan permainan atau spreadsheet kecil. Tipe grid di bawah ini adalah [[i32; 3]; 2], yang dibaca “2 baris, masing-masing berupa array berisi 3 nilai i32.”

fn main() {
// 2 baris, 3 kolom
let grid = [
[1, 2, 3],
[4, 5, 6],
];
println!("Baris 1, kolom 2: {}", grid[1][2]);
let mut total = 0;
for row in grid {
println!("{:?}", row);
for value in row {
total += value;
}
}
println!("Total: {total}");
}

Output:

Baris 1, kolom 2: 6
[1, 2, 3]
[4, 5, 6]
Total: 21
▶ Coba sendiri

grid[1][2] artinya “baris 1, lalu kolom 2 di dalam baris itu.” Keduanya mulai dihitung dari 0, jadi ini baris kedua, nilai ketiga. Untuk mengunjungi setiap nilai, pakai satu perulangan untuk baris dan perulangan kedua di dalamnya untuk nilai di setiap baris.

Setiap baris harus punya panjang yang sama, karena panjang baris adalah bagian dari tipenya. Kalau kamu juga butuh posisi saat melakukan perulangan, .iter().enumerate() memberimu indeks dan nilainya sekaligus. Caranya ditunjukkan di halaman perulangan for.

Pakai array kalau ukurannya tetap dan sudah diketahui dari awal (misalnya tujuh hari dalam seminggu). Pakai Vec kalau kamu perlu menambah atau menghapus item, dan dalam praktik, itu yang paling sering terjadi. Di kode Rust sehari-hari, array lebih jarang dipakai daripada vektor.

Buat array [4, 8, 15, 16, 23, 42]. Jumlahkan semua nilainya, lalu cetak jumlah dan rata-ratanya dengan dua angka di belakang koma. Petunjuk: lakukan perulangan dengan for, simpan total yang terus bertambah, dan ubah kedua angka menjadi f64 dengan as sebelum membagi.

Lihat solusi
fn main() {
let numbers = [4, 8, 15, 16, 23, 42];
let mut total = 0;
for n in numbers {
total += n;
}
let average = total as f64 / numbers.len() as f64;
println!("Jumlah: {total}");
println!("Rata-rata: {average:.2}");
}

Output:

Jumlah: 108
Rata-rata: 18.00
▶ Coba sendiri

Tanpa as f64, total / numbers.len() akan menjadi pembagian bilangan bulat, dan Rust juga akan protes bahwa total (sebuah i32) dan len() (sebuah usize) bertipe berbeda.

Kamu punya data suhu selama seminggu: [18, 25, 12, 31, 22, 27, 19]. Temukan dan cetak suhu tertinggi. Petunjuk: mulai dengan let mut hottest = temps[0];, lalu lakukan perulangan dan ganti nilainya setiap kali kamu menemukan nilai yang lebih besar.

Lihat solusi
fn main() {
let temps = [18, 25, 12, 31, 22, 27, 19];
let mut hottest = temps[0];
for t in temps {
if t > hottest {
hottest = t;
}
}
println!("Hari terpanas: {hottest}");
}

Output:

Hari terpanas: 31
▶ Coba sendiri

Memulai dari temps[0] alih-alih 0 itu penting: kalau semua suhunya di bawah nol, memulai dari 0 akan memberi jawaban yang salah.

  • Array punya panjang tetap yang menjadi bagian dari tipenya: [i32; 5].
  • Akses elemen dengan array[index], mulai dari 0.
  • Akses di luar batas membuat program panic saat berjalan, bukan menimbulkan undefined behavior.
  • Array bisa berisi array: [[i32; 3]; 2] adalah grid yang kamu baca dengan grid[row][column].
  • Kalau kamu perlu mengubah ukurannya, pakai Vec.

Kuis singkat

1. Apa yang benar tentang panjang array di Rust?

2. Apa yang terjadi kalau kamu mengakses indeks array di luar batas saat program berjalan?

3. Apa yang dibuat oleh let zeros = [0; 5];?

Skor: 0 / 3