Modül dersleri (1/2)
Ömürler ve Referanslar
Rust'ta her referansın bir ömrü vardır ve bu, o referansın geçerli olduğu kapsama karşılık gelir. Çoğu zaman, ömürler örtülüdür ve ömür boyu seçim kuralları sayesinde derleyici tarafından çıkarılır. Ancak farklı referansların yaşam süreleri arasındaki ilişki belirsiz olduğunda bunlara açıkça açıklama eklememiz gerekir.
Yaşam sürelerinin temel amacı sarkan referansları (halihazırda bellekten ayrılmış verilere yapılan referanslar) önlemektir.
Ömür Boyu Ek Açıklama Söz Dizimi
Ömür boyu adlar kesme işaretiyle (') başlar ve genellikle kısa küçük harflerden oluşur ('a gibi). Ömür boyu açıklamalar değişkenlerin gerçek ömrünü değiştirmez ancak derleyiciye girdilerin ve çıktıların geçerliliği arasındaki ilişkiyi gösterir.
Örneğin, bir işlev iki dize referansı parametresi alır ve bir dize başvurusu döndürürse ve döndürülen başvurunun her iki giriş parametresi de geçerli olduğu sürece geçerli olmasını istersek şunu kullanırız:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}Veri Yapılarındaki Yaşam Süreleri
Bir yapı referans olan bir alan içeriyorsa, struct örneğinin atıfta bulunduğu verilerden daha uzun süre dayanmamasını sağlamak için bu referansın yaşam süresine açıkça açıklama eklemeliyiz:
struct ImportantExcerpt<'a> {
part: &'a str,
}
fn main() {
let novel = String::from("Call me Ishmael. Some years ago...");
let first_sentence = novel.split('.').next().unwrap();
let i = ImportantExcerpt {
part: first_sentence,
};
}Statik Ömür
'static ömrü, programın tüm süresi boyunca süren özel bir ömürdür. Tüm dize değişmezleri (&str) dolaylı olarak 'static ömrüne sahiptir çünkü bunlar doğrudan yürütülebilir ikili dosyanın içinde depolanır.
let s: &'static str = "I have a static lifetime.";Kendin dene
Alıştırma 1: En uzun işlev
En uzun<'a> adında, &'a str türünde x ve &'a str türünde y olmak üzere iki parametre kabul eden ve &'a str türünde bir değer döndüren bir işlev yazın. Fonksiyonun içinde, eğer uzunluğu y'den büyükse x'i, aksi durumda y'yi döndürmek için if/else bloğunu kullanın.
İpucu göster
İmzayı `fn en uzun<'a>(x: &'a str, y: &'a str) -> &'a str`ile bildirin. Daha sonra`if x.len() > y.len() { x } else { y }` komutunu kullanın.
3 denemeden sonra çözüm mevcut
Alıştırma 2: Referanslı Yapılar
&'a str türünün parçası adlı tek bir alanı içeren Excerpt<'a> adında bir yapı tanımlayın. Ana işlevde, text adında bir dize değişkeni oluşturun ve metne bir referans ödünç alarak Alıntı türünde bir değişken alıntısı örneği oluşturun. Alıntı kısmını yazdır.
İpucu göster
`struct Excerpt<'a> { part: &'a str }` kullanın. Ana olarak bunu 'Alıntı { kısım: &metin }' ile başlatın.
3 denemeden sonra çözüm mevcut
Alıştırma 3: Statik Referanslar
Statik yaşam süresi (&'statik str) için açık bir tür açıklamasıyla mesaj adlı bir değişken bildirin ve ona bir dize sabit değeri atayın. Mesajın değerini yazdırın.
İpucu göster
Statik yaşam süresine açıkça açıklama eklemek için `let message: &'static str = 'Messaggio statico!';` sözdizimini kullanın.
3 denemeden sonra çözüm mevcut