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:
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:
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.
let s: &'static str = "I have a static lifetime.";Cobalah sendiri
Latihan 1: Fungsi terpanjang
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.
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
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.
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
Deklarasikan variabel bernama message dengan anotasi tipe eksplisit untuk masa pakai statis (&'statis str), dengan menetapkannya sebagai string literal. Cetak nilai pesan.
Tunjukkan petunjuk
Gunakan sintaksis `let message: &'static str = 'Messaggio statico!';` untuk secara eksplisit memberi anotasi pada masa pakai statis.
Solusi tersedia setelah 3 upaya