Rust'ta sıkı bellek sahipliği sistemi nedeniyle bir yaşam süresi mekanizması (lifetimes) ortaya çıktı; bu, derleyicinin referansların geçerliliğini kontrol etmesini sağlar. Ancak, yaşam sürelerini manuel olarak belirtmek sıkıcı olacağından, dilde, derleyicinin belirli durumlarda yaşam sürelerini otomatik olarak çıkarmasına izin veren "elision" kuralları getirildi.
Referansların yaşam sürelerinin düzgün yönetilmemesi, askıda kalan işaretçiler (dangling pointers) veya bellek yarışları gibi hatalara yol açabilir. Eğer programcı her zaman açıkça yaşam sürelerini belirtmek zorunda kalsaydı, bu çok geliştirme sürecini karmaşıklaştırırdı.
Rust derleyicisi, yaygın işlev imzalarında otomatik olarak hangi yaşam sürelerinin giriş referansları ve döndürülen değerler arasında bağlanması gerektiğini tanımlamak için yaşam süresi elision kurallarını kullanır. Bu, şablon kod miktarını azaltır ve API'yi daha anlaşılır hale getirirken güvenliği korur.
Kod örneği:
fn get_first(s: &str) -> &str { // yaşam süresi elision &s[..1] }
Burada derleyici, sonuç yaşam süresini çıkarır - bu, giriş parametresi s'nin yaşam süresine eşittir.
Anahtar özellikler:
Neden her zaman yaşam sürelerini atlayamaz ve elision kurallarına güvenemezsiniz?
Elision sadece "basit" durumlarda çalışır. Örneğin, eğer bir fonksiyon giriş referanslarından birini döndürüyorsa, derleyici onların yaşam sürelerini bağlayabilir; ancak birkaç belirsiz ilişki mevcutsa, bir derleme hatası oluşur ve her şeyi açıkça anot etmek gerekir.
fn pick<'a>(a: &'a str, b: &'a str, first: bool) -> &'a str { if first { a } else { b } } // Burada 'a açıktan belirtilmelidir, aksi takdirde derleyici ilişkiyi anlayamaz.
Sadece referans alan alanlar içeren bir yapı için yaşam süresi atlanabilir mi?
Hayır, eğer bir yapı referans alanları içeriyorsa, yapının bir yaşam süresi parametresine sahip olması zorunludur, böylece yapı örneği verilerinden daha uzun yaşamaz.
struct Foo<'a> { data: &'a str, }
Yerel bir değişkene referansı döndürmeye çalışırsanız ne olur?
Derleyici hata verecektir, hatta kurallar formel olarak yaşam süresini "çıkarabilse bile". Rust, yaşam sürelerini sadece türle değil, aynı zamanda kapsamla da izler.
Bir programcı, içinde yerel geçici bir tamponun referansını döndüren yaşam süresini açıkça belirtmediği bir API yazmıştır. Derleyici kodu reddetti, ancak hatayı "çözmeye" çalışırken hatalı yaşam süresi anotasyonları eklenmiştir ve ardından birkaç kafa karıştırıcı hata ortaya çıkmıştır.
Artıları:
Eksileri:
Kütüphane API'sinde, gerçekten gerekli olduğu yerlerde doğru yaşam süresi anotasyonları kullanılır. Diğer her şey - otomatik elision kuralları ile kaplanır, bu da kodun özlü ve anlaşılır olmasını sağlar.
Artıları:
Eksileri: