Lifetime

Lifetime

Lifetime adalah bagian dari fitur ownership yang tersedia di Rust. Sebelumnya jika kalian melihat bahasan tentang borrowing & references, dimana references akan tetap valid jika berada didalam ruang lingkupnya, namun jika telah berada diluar scope maka semuanya akan terhapus dari memori. Nah bisa dibilang lifetime adalah scope, fitur ini memudahkan kita untuk mengatur scope yang ada di Rust.

Jika bermain dengan references ada hal yang menjadi problem yaitu dangling references, masalah ini dikenal dengan referensi yang menggantung, ini terjadi karena ada sebuah nilai yang mereferensi ke sebuah alamat yang tidak valid, di dalam memori. Untuk menangani masalah tersebut Rust menyediakan fitur lifetime yang bisa kita gunakan untuk mengatur ruang lingkup sehingga bisa tetap valid.

Dangling References

fn main() {
let s;
{
let x = 5;
s = &x
}
println!("{}", s);
}
error[E0597]: `x` does not live long enough
--> main.rs:6:13
|
6 | s = &x
| ^^ borrowed value does not live long enough
7 | }
| - `x` dropped here while still borrowed
8 | println!("{}", s);
| - borrow later used here

Kode diatas punya dua ruang lingkup yaitu global scope, dan block scope, variable s memiliki masa hidup yang lebih lama jika dibandingkan dengan variabel x, kemudian nilai dari variabel s di timpa dengan variable references yang mereferensi ke x, atau dipinjamkan nilai oleh x. Nah masalahnya adalah variable s kemudian diakses setelah variable x terhapus dari memori, sehingga tidak valid lagi nilainya, ini yang dinamakan dangling references.

Lifetime in function

Lifetime dapat dibuat dengan menggunakan keyword 'a dimana a mewakili lifetime. Jika di implementasi di dalam sebuah function akan seperti ini.

fn main() {
let first_letter = "Hallo indonesia";
let second_letter = "hallo";
let longest = longest(first_letter, second_letter);
println!("{}", longest); // "Hallo indonesia"
}
fn longest<'a>(first: &'a str, second: &'a str) -> &'a str {
if first.len() > second.len() {
first
} else {
second
}
}

Terlihat di atas lifetime 'a mewakili ruang lingkup yang ada di dalam function longest sehingga scope dari dua parameter di atas akan tetap valid.