ProgramlamaRust Geliştirici

Rust'ta lifetimes nedir ve referanslarla çalışırken neden gereklidir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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.

Aldatmacalı Soru

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.

Gerçek Hatalara Dair Örnekler


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.