Chaining methods

Rust adalah systems programming language seperti C dan C++, dan codenya dapat ditulis sebagai perintah terpisah di baris yang terpisah, tapi ia juga memiliki functional style. Kedua style ini oke-oke saja, tapi functional style biasanya dituliskan jauh lebih pendek. Ini adalah contoh dari non-functional style (yang biasa disebut sebagai "imperative style") untuk membuat Vec dari 1 sampai 10:

fn main() {
    let mut new_vec = Vec::new();
    let mut counter = 1;

    while counter < 11 {
        new_vec.push(counter);
        counter += 1;
    }

    println!("{:?}", new_vec);
}

Ia mencetak [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].

Dan ini contoh untuk mencetak hal serupa menggunakan functional style:

fn main() {
    let new_vec = (1..=10).collect::<Vec<i32>>();
    // Atau Anda bisa menuliskannya seperti ini:
    // let new_vec: Vec<i32> = (1..=10).collect();
    println!("{:?}", new_vec);
}

.collect() bisa membuat collections dari berbagai type, sehingga kita perlu untuk menyebutkan apa typenya.

Dengan functional style, Anda bisa melakukan chain methods. "Chaining methods" artinya menggunakan banyak method sekaligus didalam sebuah statement. Ini adalah contoh dari banyak method yang digunakan secara bersamaan/berantai:

fn main() {
    let my_vec = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let new_vec = my_vec.into_iter().skip(3).take(4).collect::<Vec<i32>>();

    println!("{:?}", new_vec);
}

Ini akan membuat sebuah Vec yang berisi [3, 4, 5, 6]. Pada code tersebut, terlalu banyak hal yang dituliskan dalam satu baris, sehingga untuk membuatnya lebih rapi kita bisa membuat memisahkan setiap methodnya per baris. Mari kita lakukan ini agar codenya menjadi lebih mudah dibaca:

fn main() {
    let my_vec = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let new_vec = my_vec
        .into_iter() // lakukan "iterate" pada setiap element (iterate/iterasi = melakukan sesuatu pada setiap element di dalamnya). into_iter() memberikan  owned value, bukan reference
        .skip(3) // lewati 3 item: 0, 1, dan 2
        .take(4) // ambil 4 item selanjutnya: 3, 4, 5, dan 6
        .collect::<Vec<i32>>(); // letakkan hasilnya di Vec<i32>

    println!("{:?}", new_vec);
}

Anda bisa menggunakan functional style secara maksimal apabila Anda mengerti closure dan juga iterator, yang mana akan kita pelajari selanjutnya.