Lompati ke konten utama
Modul 6 · Pelajaran 1 dari 211/14 dalam kursus~15 min
Pelajaran modul (1/2)

Seumur Hidup dan Referensi

Di Rust, setiap referensi memiliki masa berlaku, yang sesuai dengan cakupan validitas referensi tersebut. Seringkali, masa hidup tersirat dan disimpulkan oleh kompiler berkat aturan elision seumur hidup. Namun, ketika hubungan antara masa hidup referensi yang berbeda bersifat ambigu, kita harus memberi anotasi secara eksplisit.

Tujuan utama dari masa hidup adalah untuk mencegah referensi yang menjuntai (referensi ke data yang telah dibatalkan alokasinya dari memori).


Sintaks Anotasi Seumur Hidup

Nama seumur hidup dimulai dengan tanda kutip (') dan biasanya berupa huruf kecil pendek (seperti 'a). Anotasi seumur hidup tidak mengubah masa hidup variabel yang sebenarnya, namun menunjukkan kepada penyusun hubungan antara validitas masukan dan keluaran.

Misalnya, jika suatu fungsi mengambil dua parameter referensi string dan mengembalikan referensi string, dan kami ingin referensi yang dikembalikan valid selama kedua parameter input valid, kami menggunakan:

Rust
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

Seumur hidup dalam Struktur Data

Jika suatu struktur berisi bidang yang merupakan referensi, kita harus secara eksplisit memberi anotasi seumur hidup pada referensi tersebut untuk memastikan bahwa instance struct tidak dapat hidup lebih lama dari data yang dirujuknya:

Rust
struct ImportantExcerpt<'a> {
    part: &'a str,
}

fn main() {
    let novel = String::from("Call me Ishmael. Some years ago...");
    let first_sentence = novel.split('.').next().unwrap();
    let i = ImportantExcerpt {
        part: first_sentence,
    };
}

Seumur Hidup Statis

Seumur hidup 'static adalah seumur hidup khusus yang berlangsung selama seluruh durasi program. Semua literal string (&str) secara implisit memiliki masa pakai 'static karena disimpan langsung di dalam biner yang dapat dieksekusi.

Rust
let s: &'static str = "I have a static lifetime.";

Cobalah sendiri

Latihan 1: Fungsi terpanjang

Latihan#rust.m6.l1.e1
Upaya: 0Memuat…

Tulis fungsi bernama terpanjang<'a> yang menerima dua parameter, x bertipe &'a str dan y bertipe &'a str, dan mengembalikan nilai bertipe &'a str. Di dalam fungsi, gunakan blok if/else untuk mengembalikan x jika panjangnya lebih besar dari y, jika tidak, kembalikan y.

Memuat editor…
Tunjukkan petunjuk

Deklarasikan tanda tangan dengan `fn terpanjang<'a>(x: &'a str, y: &'a str) -> &'a str`. Kemudian gunakan `if x.len() > y.len() { x } else { y }`.

Solusi tersedia setelah 3 upaya

Latihan 2: Struktur dengan Referensi

Latihan#rust.m6.l1.e2
Upaya: 0Memuat…

Definisikan struktur bernama Excerpt<'a> yang berisi satu bidang bernama bagian dari tipe &'a str. Dalam fungsi utama, buat variabel string bernama teks dan buat instance variabel kutipan bertipe Kutipan dengan meminjam referensi ke teks. Cetak kutipan.bagian.

Memuat editor…
Tunjukkan petunjuk

Gunakan `struct Excerpt<'a> { bagian: &'a str }`. Pada dasarnya, buat instance-nya dengan `Kutipan { bagian: &teks }`.

Solusi tersedia setelah 3 upaya

Latihan 3: Referensi Statis

Latihan#rust.m6.l1.e3
Upaya: 0Memuat…

Deklarasikan variabel bernama message dengan anotasi tipe eksplisit untuk masa pakai statis (&'statis str), dengan menetapkannya sebagai string literal. Cetak nilai pesan.

Memuat editor…
Tunjukkan petunjuk

Gunakan sintaksis `let message: &'static str = 'Messaggio statico!';` untuk secara eksplisit memberi anotasi pada masa pakai statis.

Solusi tersedia setelah 3 upaya