Vektor di Rust
Vektor (Vec) mirip dengan array, tapi ukurannya bisa bertambah dan berkurang saat program berjalan. Di kode Rust sehari-hari, kalau kamu butuh sebuah daftar, kamu akan jauh lebih sering memakai Vec daripada array berukuran tetap.
Membuat vektor
Section titled “Membuat vektor”fn main() { let numbers: Vec<i32> = vec![1, 2, 3]; println!("{:?}", numbers);}vec![] adalah sebuah makro (perhatikan tanda !) yang membuat Vec dari daftar nilai, mirip dengan cara kamu menulis array.
Kamu juga bisa mulai dari vektor kosong lalu mengisinya sedikit demi sedikit:
let mut numbers: Vec<i32> = Vec::new();Menambah elemen
Section titled “Menambah elemen”Pakai .push() untuk menambah elemen di akhir. Vektornya harus mut karena kamu mengubahnya:
fn main() { let mut numbers = Vec::new();
numbers.push(1); numbers.push(2); numbers.push(3);
println!("{:?}", numbers);}Output:
[1, 2, 3]Mengakses elemen
Section titled “Mengakses elemen”Sintaks kurung sikunya sama seperti array:
fn main() { let fruits = vec!["apel", "pisang", "ceri"];
println!("{}", fruits[0]); println!("Panjang: {}", fruits.len());}Untuk mencari elemen dengan lebih aman tanpa panic kalau indeksnya salah, pakai .get(), yang mengembalikan sebuah Option (selengkapnya di halaman Option):
fn main() { let fruits = vec!["apel", "pisang", "ceri"];
match fruits.get(10) { Some(fruit) => println!("Ketemu: {fruit}"), None => println!("Tidak ada buah di indeks itu"), }}Menghapus elemen
Section titled “Menghapus elemen”fn main() { let mut numbers = vec![1, 2, 3, 4, 5];
numbers.pop(); // menghapus item terakhir -> [1, 2, 3, 4] numbers.remove(0); // menghapus berdasarkan indeks -> [2, 3, 4]
println!("{:?}", numbers);}Perulangan pada vektor
Section titled “Perulangan pada vektor”fn main() { let numbers = vec![10, 20, 30];
for n in &numbers { println!("{n}"); }}Perhatikan tanda & sebelum numbers. Perulangan for n in &numbers meminjam (borrow) setiap item alih-alih mengambil ownership (kepemilikan) vektornya. Kalau kamu menghapus &, vektornya dipindahkan (move) ke dalam perulangan, artinya kamu tidak bisa memakai numbers lagi setelahnya. Hampir selalu, meminjam adalah yang kamu mau.
Sekilas tentang generics
Section titled “Sekilas tentang generics”Kamu mungkin memperhatikan bahwa tipenya ditulis Vec<i32>. Bagian <i32> berarti “vektor berisi nilai i32.” Notasi kurung sudut ini disebut generics, dan kamu akan membahasnya dengan benar di halaman Generik. Untuk sekarang, baca saja Vec<T> sebagai “vektor yang menyimpan nilai bertipe T.”
Latihan
Section titled “Latihan”1. Kumpulkan bilangan genap
Section titled “1. Kumpulkan bilangan genap”Mulai dengan vektor kosong. Lakukan perulangan pada angka 1 sampai 10 dan push hanya yang genap. Lalu cetak vektornya dan berapa banyak item di dalamnya. Petunjuk: sebuah angka n genap kalau n % 2 == 0.
Lihat solusi
fn main() { let mut evens = Vec::new();
for n in 1..=10 { if n % 2 == 0 { evens.push(n); } }
println!("{:?}", evens); println!("Ditemukan {} bilangan genap", evens.len());}Output:
[2, 4, 6, 8, 10]Ditemukan 5 bilangan genapPerhatikan bahwa kita tidak pernah menulis tipenya. Rust melihat pemanggilan push(n) dan menyimpulkan bahwa evens adalah Vec<i32>.
2. Tumpukan piring
Section titled “2. Tumpukan piring”Masukkan tiga piring ke sebuah vektor: "biru", "hijau", lalu "merah". Ambil dua piring dari atas dengan .pop() dan cetak masing-masing. Terakhir, cetak apa yang tersisa. Petunjuk: .pop() mengembalikan Option, jadi cetak dengan {:?}.
Lihat solusi
fn main() { let mut plates = Vec::new(); plates.push("biru"); plates.push("hijau"); plates.push("merah");
println!("Diambil {:?}", plates.pop()); println!("Diambil {:?}", plates.pop()); println!("Sisa: {:?}", plates);}Output:
Diambil Some("merah")Diambil Some("hijau")Sisa: ["biru"]pop() selalu mengambil item terakhir yang kamu masukkan, seperti mengambil piring paling atas dari tumpukan. Hasilnya Some(...), bukan nilainya langsung, karena vektornya bisa saja kosong. Dalam kasus itu kamu akan mendapat None, bukan crash.
Ringkasan
Section titled “Ringkasan”Vec<T>adalah daftar yang ukurannya bisa bertambah; buat denganvec![...]atauVec::new()..push()menambah di akhir;.pop()menghapus item terakhir;.remove(i)menghapus berdasarkan indeks.vec[i]membuat program panic kalau indeksnya salah;.get(i)mengembalikanOptiondan tidak akan panic.- Lakukan perulangan dengan
for item in &vecuntuk meminjam item tanpa menghabiskan vektornya.
Kuis singkat
Section titled “Kuis singkat”Kuis singkat
1. Apa yang terjadi kalau kamu mengakses Vec dengan indeks yang salah, seperti numbers[10]?
2. Method mana yang membuatmu bisa mencari berdasarkan indeks tanpa risiko panic?
3. Apa fungsi tanda & di for n in &numbers?
Skor: 0 / 3
Bacaan lebih lanjut
Section titled “Bacaan lebih lanjut”- Storing Lists of Values with Vectors — The Rust Book (bahasa Inggris): membuat, membaca, dan memperbarui vektor, serta kenapa kamu tidak bisa
pushselagi memegang referensi. - Vectors — Rust by Example (bahasa Inggris): satu contoh yang bisa dijalankan, menunjukkan operasi
Vecyang paling umum. Vec— dokumentasi standard library (bahasa Inggris): daftar lengkap method, sepertiinsert,retain,extend, dancontains.- Makro
vec!— dokumentasi standard library (bahasa Inggris): semua bentukvec!, termasukvec![0; 10]untuk nilai yang diulang.