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.
Membuat array
Section titled “Membuat array”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.
Kamu juga bisa membiarkan Rust menebak tipenya dan cukup menulis nilainya:
let numbers = [1, 2, 3, 4, 5];Nilai yang sama, diulang
Section titled “Nilai yang sama, diulang”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);}Mengakses elemen
Section titled “Mengakses elemen”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());}Akses di luar batas akan ketahuan
Section titled “Akses di luar batas akan ketahuan”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 10Pesan dari Rust ini artinya: indeks di luar batas, panjangnya 3 tapi indeksnya 10.
Perulangan pada array
Section titled “Perulangan pada array”fn main() { let numbers = [10, 20, 30];
for n in numbers { println!("{n}"); }}Array di dalam array (array 2D)
Section titled “Array di dalam array (array 2D)”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: 21grid[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.
Array vs vektor
Section titled “Array vs vektor”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.
Latihan
Section titled “Latihan”1. Jumlah dan rata-rata
Section titled “1. Jumlah dan rata-rata”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: 108Rata-rata: 18.00Tanpa 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.
2. Hari terpanas
Section titled “2. Hari terpanas”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: 31Memulai dari temps[0] alih-alih 0 itu penting: kalau semua suhunya di bawah nol, memulai dari 0 akan memberi jawaban yang salah.
Ringkasan
Section titled “Ringkasan”- 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 dengangrid[row][column]. - Kalau kamu perlu mengubah ukurannya, pakai
Vec.
Kuis singkat
Section titled “Kuis singkat”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
Bacaan lebih lanjut
Section titled “Bacaan lebih lanjut”- The Array Type — The Rust Book (bahasa Inggris): pengenalan resmi tentang array, termasuk kenapa panjangnya menjadi bagian dari tipe.
- Arrays and Slices — Rust by Example (bahasa Inggris): contoh singkat yang bisa dijalankan, plus perkenalan pertama dengan slice.
- Looping Through a Collection with
for— The Rust Book (bahasa Inggris): kenapa perulanganforlebih aman daripada menelusuri array dengan indeks. array— dokumentasi standard library (bahasa Inggris): apa saja yang bisa dilakukan array, sepertimapdanas_slice, dan bagaimana array juga bisa memakai semua method slice.