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.