CodeBlanks Logo Icon CodeBlanks

Struct ömürleri

Referans tutan struct'larda ömür parametresi kullanırsın.

Struct ömürleri

Bir struct referans tutuyorsa, alanın ömrü struct tanımında belirtilmelidir. Bu, "struct, gösterdiği veriden uzun yaşayamaz" demektir:

struct Alinti<'a> {
    parca: &'a str,
}

let roman = String::from("Bir varmış. Bir yokmuş.");
let ilk = roman.split('.').next().unwrap();
let a = Alinti { parca: ilk };

roman bırakılmadan önce a kullanılmayı bitirmelidir. Bu yaklaşım büyük metinleri kopyalamadan parçalara bölmek için kullanılır.

Ömürlü struct'a metot

impl bloğunda da ömür parametresi bildirilir. Bir metot struct'ın tuttuğu referansı döndürüyorsa 'a ile döndürmek, sonucun struct'tan bağımsız olarak kaynak kadar yaşamasını sağlar:

impl<'a> Alinti<'a> {
    fn uzunluk(&self) -> usize {
        self.parca.chars().count()
    }
    fn parca(&self) -> &'a str {
        self.parca
    }
}

Uygulama Alıntı

Yukarıdaki Alinti<'a> struct'ını ve uzunluk, parca metotlarını yaz. "Bir varmış. Bir yokmuş." metninin ilk cümlesini (split('.')) alıntıla; parçayı ve karakter sayısını boşlukla yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
struct Alinti<'a> {
    parca: &'a str,
}

impl<'a> Alinti<'a> {
    fn uzunluk(&self) -> usize {
        self.parca.chars().count()
    }
    fn parca(&self) -> &'a str {
        self.parca
    }
}

fn main() {
    let roman = String::from("Bir varmış. Bir yokmuş.");
    let ilk = roman.split('.').next().unwrap();
    let a = Alinti { parca: ilk };
    println!("{} {}", a.parca(), a.uzunluk());
}

Beklenen çıktı

Bir varmış 10

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>struct Alinti { parca: &amp;str }</code> (ömürsüz) yazılırsa ne olur?

  • parca 'static olur
  • Derlenir
  • parca String olur
  • E0106: ömür belirtilmeli Doğru cevap

Açıklama: Struct alanlarında ömür çıkarımı yapılmaz; ya <'a> eklenir ya da String gibi sahip olunan bir tür kullanılır.

2 Ömürlü alan

Soru
struct Alinti<'a> {
    parca: ____,
}
Cevap
struct Alinti<'a> {
    parca: &'a str,
}

Açıklama: Referans alanı struct'ın ömür parametresiyle işaretlenir.

3 Tanım ve anlamı

Kavram Anlamı
struct A<'a> { p: &'a str } Referans tutan struct
impl<'a> A<'a> Ömürlü impl
fn p(&self) -> &'a str Kaynağa bağlı dönüş
struct B { p: String } Ömür gerekmez

Orta seviye bölümündeki tüm dersler