Rust'ta lifetimes, referansların görünürlük alanını tanımlar, böylece derleyici işaretçilerin havada kalmadığından emin olabilir (asılı referanslar yok). Bu, hafıza güvenliğini derleme zamanında sağlamak için çözümler sunar, çöp toplayıcısına ihtiyaç duymadan.
Referanslarla çalışırken, Rust'un açıkça zamanlarını belirtmenizi gerektirdiği durumlar vardır, derleyici bunu kendi başına çıkaramaz. Bu genellikle 'a sözdizimi ile yapılır:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() > y.len() { x } else { y } }
Burada her iki parametre ve dönen değer aynı lifetime'e sahiptir, bu da döndürülen referansın, argümanlardan herhangi birinden daha uzun yaşamayacağını garanti eder.
Lifetimes, verilerin yaşam süresini değiştirmez, yalnızca derleyiciye açıklar.
Bir fonksiyon içindeki yerel bir değişkene referans döndürebilir miyim?
Hayır, dönemezsiniz: çünkü böyle bir değişken fonksiyondan çıkarken yok edilir. Örnek:
fn foo() -> &String { // derleme hatası! let s = String::from("hello"); &s } // s üzerindeki referans geçersiz hale gelir
Derleyici böyle bir kodun derlenmesine izin vermez; sizi yok edilmiş verilere referans kullanmaktan korur.
Hikaye
Ekibin içinde birçok bellek sızıntısı meydana geldi; fonksiyonlar istemeden yerel tamponlara referans döndürüyorlardı. Bu işe yaramadı ve derleyici lifetimes üzerinde uyarılar vermeye başlayana kadar hiçbir şey çözülmedi. Bu tür hataların sıkça ortaya çıkması nedeniyle, karmaşık yapılarla çalışan fonksiyonlar için açıkça lifetime belirtilmesi kuralı benimsenmiştir.
Hikaye
Bir projede, veri önbellekleme için generics kodu yazılmıştı. Eğer lifetime generic parametreleri yanlış tasarlanırsa "cannot infer lifetime" türünde hatalar ortaya çıkıyordu ve önbellekte saklanan verilerin yaşam süresini çıkarmak imkansız hale geliyordu. Bu, deneme yanılma yöntemiyle lifetime notasyonlarını ayarlamaya yol açtı; en sonunda önbelleğe alınan ve alınmayan verileri farklı yapılara ayırma kararı alındı.
Hikaye
Bir çalışma arkadaşı, bağlantı nesnelerine referanslar kullanarak bir bağlantı havuzu uygulamaya çalıştı, ancak bağlantıların lifetimes'ının havuzun yaşam süresi ile uyuşmadığını dikkate almadı. Sonuçta, bağlantılar serbest bırakıldıktan sonra asılı referanslar oluştu ve bu, yalnızca kapsamlı test aşamasında fark edildi. Sonrasında proje güvenli sarmalayıcılar (Arc<Mutex<T>>) kullanmaya geçti.