Collection types
Rust memiliki banyak type untuk membuat collection. Collection berguna di saat Anda memerlukan lebih dari 1 value pada 1 variabel. Contohnya, Anda bisa memiliki informasi yang berisi semua nama-nama kota di dalam 1 variabel. Kita akan memulainya dengan array, yang mana ia adalah yang tercepat dalam hal seperti ini, namun juga memiliki kegunaan yang paling sedikit. Array ini mirip seperti &str
, yang mana ia adalah yang paling cepat, namun kegunaannya pun juga yang paling sedikit.
Arrays
Array adalah data yang dituliskan di dalam square bracket: []
. Syaratnya:
- Array tidak boleh mengubah ukurannya,
- Array hanya boleh berisi type yang sama.
Seperti yang tadi kita sebutkan, meskipun terbatas, ia sangat cepat.
Type pada array adalah: [type; number]
. Contohnya, type dari ["One", "Two"]
adalah [&str; 2]
. Ini artinya, bahkan 2 buah array pun bisa saja memiliki type yang berbeda. Begini contohnya:
fn main() { let array1 = ["One", "Two"]; // Type dari array1 adalah [&str; 2] let array2 = ["One", "Two", "Five"]; // Tapi untuk array2 ini typenya adalah [&str; 3]. Keduanya memiliki type yang berbeda! }
Ini adalah saran yang baik: untuk mengetahui type dari sebuah variabel, Anda bisa "bertanya" ke compiler dengan cara memberikannya instruksi yang asal-asalan. Contohnya:
fn main() { let seasons = ["Spring", "Summer", "Autumn", "Winter"]; let seasons2 = ["Spring", "Summer", "Fall", "Autumn", "Winter"]; seasons.ddd(); // ⚠️ seasons2.thd(); // ⚠️ as well }
Compiler akan menegur kita, "What? There's no .ddd()
method for seasons and no .thd()
method for seasons 2 either!!" persis seperti yang bisa kita lihat lewat pesan berikut:
error[E0599]: no method named `ddd` found for array `[&str; 4]` in the current scope
--> src\main.rs:4:13
|
4 | seasons.ddd(); //
| ^^^ method not found in `[&str; 4]`
error[E0599]: no method named `thd` found for array `[&str; 5]` in the current scope
--> src\main.rs:5:14
|
5 | seasons2.thd(); //
| ^^^ method not found in `[&str; 5]`
Compiler akan menuliskan method not found in `[&str; 4]`
, yang mana typenya adalah yang ada di dalam square bracket.
Jika Anda ingin array dengan value yang sama, Anda bisa mendeklarasikannya seperti ini:
fn main() { let my_array = ["a"; 10]; println!("{:?}", my_array); }
Hasilnya adalah ["a", "a", "a", "a", "a", "a", "a", "a", "a", "a"]
.
Cara ini kebanyakan digunakan untuk untuk membuat buffer (inisialisasi array dimana semua value di dalamnya bernilai 0). Contohnya, let mut buffer = [0; 640]
akan membuat array yang berisi 640 angka 0 di dalamnya. Kemudian kita bisa mengubah 0 menjadi angka yang lain untuk keperluan menambah data.
Anda bisa mengambil/menarik index pada array menggunakan []. Index yang paling awal adalah [0], yang kedua adalah [1], dan seterusnya.
fn main() { let my_numbers = [0, 10, -20]; println!("{}", my_numbers[1]); // cetak 10 }
Anda bisa mengambil slice (potongan) pada array. Pertama-tama, Anda memerlukan &
, karena compiler tidak mengetahui ukurannya. Kemudian Anda gunakan ..
untuk menunjukkan rangenya.
Contohnya, kita gunakan array ini: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
.
fn main() { let array_of_ten = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let three_to_five = &array_of_ten[2..5]; let start_at_two = &array_of_ten[1..]; let end_at_five = &array_of_ten[..5]; let everything = &array_of_ten[..]; println!("Three to five: {:?}, start at two: {:?}, end at five: {:?}, everything: {:?}", three_to_five, start_at_two, end_at_five, everything); }
Ingat ini:
- Index selalu dimulai dari 0 (bukan 1)
- Index ranges bersifat eksklusif (ia tidak akan memasukkan angka terakhir)
Jadinya [0..2]
artinya adalah index yang pertama dan yang kedua (0 and 1). Atau Anda bisa menyebutnya dengan index ke-0 dan ke-1. Ia tidak memiliki item ke-3, karena ia tidak memsukkan index ke-2.
Anda juga bisa menggunakan range yang sifatnya inklusif, yang artinya ia akan mengikutkan angka yang terakhir juga. Untuk melakukan ini, tambahkan =
untuk menuliskan ..=
untuk menggantikan ..
. Sehingga, [0..2]
kita ganti menjadi [0..=2]
jika Anda menginginkan item pertama, kedua, dan ketiga.