More on references

See this chapter on YouTube

Reference sangat penting di Rust. Rust menggunakan reference untuk memastikan bahwa semua akses ke memori benar-benar aman. Kita tahu bahwa kita menggunakan & untuk membuat reference:

fn main() {
    let country = String::from("Austria");
    let ref_one = &country;
    let ref_two = &country;

    println!("{}", ref_one);
}

Hasil cetaknya adalah Austria.

Pada code tersebut, country bertype String. Kemudian kita membuat 2 references ke country. Keduanya memiliki type &String, yang mana Anda bisa menyebutnya dengan "reference ke sebuah String". Kita bisa membuat tiga reference ataupun ratusan reference ke country, dan itu sama sekali tidak masalah.

Tapi untuk kasus yang ini, tentunya akan menjadi masalah:

fn return_str() -> &str {
    let country = String::from("Austria");
    let country_ref = &country;
    country_ref // ⚠️
}

fn main() {
    let country = return_str();
}

Fungsi return_str() membuat sebuah String, kemudian ia membuat reference ke String tersebut. Sesudah itu, reference yang tadi dibuat akan di-return. Akan tetapi, String country hanya hidup (bisa diakses) pada fungsi tersebut, dan kemudian ia mati (hancur/hangus). Setelah variabel tersebut mati, komputer akan membersihkan memori dan menggunakannya untuk hal lain. Jadi, setelah fungsi tersebut selesai, country_ref mereferensi ke memori yang sebenarnya sudah menghilang, dan itu berbahaya. Rust mencegah kita dari membuat kesalahan pada memori, salah satunya adalah kesalahan yang seperti ini.

Ini adalah bagian terpenting tentang "owned" type yang kita sebut-sebut di atas. Karena Anda memiliki String, Anda bisa memindahkan kepemilikannya. Hanya saja, &String akan mati jika Stringnya mati, jadinya Anda tidak bisa memindahkan "ownership" dengan cara seperti ini.