CodeBlanks Logo Icon CodeBlanks

Elision kuralları

Ömür elision (kısaltma) kurallarını öğrenirsin.

Elision kuralları

Çoğu fonksiyonda ömür yazmana gerek kalmamasının nedeni derleyicinin üç atlama (elision) kuralıdır:

  1. Her referans parametresi kendi ömrünü alır.
  2. Tam olarak bir referans parametresi varsa, onun ömrü tüm dönüş referanslarına verilir.
  3. Parametrelerden biri &self ya da &mut self ise, self'in ömrü dönüşe verilir.
fn kisalt(s: &str) -> &str           // kural 2: fn kisalt<'a>(s: &'a str) -> &'a str
fn ad(&self, ek: &str) -> &str       // kural 3: dönüş self'e bağlı

Kurallar iş başında

Aşağıdaki iki fonksiyonda hiçbir ömür yazılmamıştır ama ikisi de geçerlidir:

fn kisalt(s: &str) -> &str {
    s.get(..3).unwrap_or(s)
}

struct Kisi { ad: String }

impl Kisi {
    fn ad(&self) -> &str {
        &self.ad
    }
}

get(..3) güvenli dilimdir: metin 3 bayttan kısaysa ya da 3. bayt karakter ortasına düşerse None döner.

Uygulama Ömürsüz imzalar

Yukarıdaki kisalt fonksiyonunu ve Kisi türünün ad metodunu ömür yazmadan tanımla. kisalt("Programlama") ve Kisi { ad: "Ece".to_string() }.ad() sonuçlarını boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn kisalt(s: &str) -> &str {
    s.get(..3).unwrap_or(s)
}

struct Kisi {
    ad: String,
}

impl Kisi {
    fn ad(&self) -> &str {
        &self.ad
    }
}

fn main() {
    let k = Kisi { ad: "Ece".to_string() };
    println!("{} {}", kisalt("Programlama"), k.ad());
}

Beklenen çıktı

Pro Ece

Soru ve cevaplar

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

1 <code>fn f(a: &amp;str, b: &amp;str) -&gt; &amp;str</code> neden ömür ister?

  • str ömür gerektirir her zaman
  • İstemez
  • İki referans parametresi var ve self yok; kural 2 ve 3 uygulanamıyor Doğru cevap
  • Dönüş türü yanlış

Açıklama: Kurallar dönüş ömrünü belirleyemediğinde derleyici açıklama ister (E0106).

2 Atlanmış ömür

Soru
fn kisalt(s: &str) -> ____ {
    s.get(..3).unwrap_or(s)
}
Cevap
fn kisalt(s: &str) -> &str {
    s.get(..3).unwrap_or(s)
}

Açıklama: Tek referans parametresi olduğu için dönüş ömrü otomatik ona bağlanır.

3 İmza ve uygulanan kural

Kavram Anlamı
fn f(x: &str) -> &str Kural 2
fn f(&self, y: &str) -> &str Kural 3
fn f(x: &str, y: &str) Kural 1 (dönüş yok)
fn f(x: &str, y: &str) -> &str Açıklama gerekir

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