ProgramlamaRust sistem geliştiricisi

Rust'ta bir yapı başka nesnelere referanslar içerebilir mi? Bu referansların yaşam süreleri ile ilgili kısıtlamalar nelerdir ve bir fonksiyondan, eksik referans yaşam sürelerine sahip bir yapıyı döndürmeye çalışıldığında ne olur?

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

Cevap

Rust'ta yapılar, yapı tanımında açık yaşam süreleri (lifetimes) belirterek diğer nesnelere olan referansları saklayabilir. Bu, derleyicinin hiçbir referansın geçersiz hale gelmeyeceğini kontrol etmesine olanak tanır. İşte bir örnek:

struct Book<'a> { title: &'a str, author: &'a str, }

Burada Book yapısı, aynı yaşam süresine sahip iki referans içerir: 'a. Böyle bir yapıyı döndüren bir fonksiyon yazarken, onun içinde bulunan tüm referansların, fonksiyonun iç mantığından bağımsız olarak geçerli olmasını sağlamalısınız:

fn book_factory<'a>(title: &'a str, author: &'a str) -> Book<'a> { Book { title, author } }

Eğer bir fonksiyondan, örneğin, o fonksiyonun yerel değişkenlerine işaret eden referanslar içeren bir yapıyı döndürmeye çalışırsanız, referansların yaşam süreleri güvenli erişim için yeterli olmadığından bir derleme hatası meydana gelir.

Kandırmaca Sorusu

Bir yapıyı, bir alanında bir referans (&str) ve başka bir alanında bir String içerecek şekilde oluşturmak mümkün mü? Bunun sorun olmasının nedeni nedir?

Yanlış cevap genellikle: "Evet, mümkün, bu güvenli".

Aslında, eğer &str bir String'den alınmışsa ve yapı bu String'den daha uzun bir süre yaşıyorsa, referans sarkık (dangling reference) hale gelir. Örneğin:

struct Test<'a> { s1: &'a str, s2: String, } fn main() { let s = String::from("hello"); let t = Test { s1: &s, s2: s }; // t.s1, gerçekten güvenli, sadece s2 (s) hayatta olduğu sürece, ama s2 ilk silindiğinde — hata }

Konuyla ilgili bilgi eksikliğinden kaynaklanan gerçek hata örnekleri


Hikaye Bir projede, yerel bir fonksiyon içinde oluşturulan geçici bir dizeye referans içeren bir yapıyı döndürmeye çalıştılar; kod derlenmedi, yerel değişkenin yaşam süresini kaldırmak için önemli bir yeniden yazma gerekti.


Hikaye Geliştirici, fonksiyonda oluşturulan bir dizi elemanına referansı olan bir yapıyı kullanmayı planlıyordu ancak döndürüldükten sonra bu referans geçersiz hale geldi, bu da derleyici tarafından başarılı bir şekilde engellendi.


Hikaye Bir kurumsal projede, geliştiriciler daha önce koleksiyondan silinen bir nesneden &str referansını sakladılar; bu referansa sonraki erişim sırasında panic oluştu.