Ana içeriğe geç
Modül 6 · Ders 1 ders 2Kurstaki 11/14~15 min
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:

Rust
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:

Rust
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.

Rust
let s: &'static str = "I have a static lifetime.";

Kendin dene

Alıştırma 1: En uzun işlev

Egzersiz#rust.m6.l1.e1
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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

Egzersiz#rust.m6.l1.e2
Denemeler: 0Yükleniyor…

&'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.

Düzenleyici yükleniyor…
İ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

Egzersiz#rust.m6.l1.e3
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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