CodeBlanks Logo Icon CodeBlanks

Fonksiyon ömürleri

Fonksiyon imzasında ömür kullanmayı öğrenirsin.

Fonksiyon ömürleri

Dönen referans yalnızca bir parametreye bağlıysa, ömrü yalnızca ona vermek çağıranı serbest bırakır:

fn once<'a>(s: &'a str, ayrac: &str) -> &'a str {
    match s.find(ayrac) {
        Some(i) => &s[..i],
        None => s,
    }
}

ayrac'ın ömrü dönüşle ilgisizdir; çağrıdan hemen sonra bırakılabilir. Her iki parametreye de 'a verseydik ayraç gereksiz yere uzun yaşamak zorunda kalırdı.

Farklı ömürler

İki parametrenin birbirinden bağımsız ömürleri gerekiyorsa iki ömür parametresi kullanılır:

fn sec<'a, 'b>(birinci: &'a str, _ikinci: &'b str) -> &'a str {
    birinci
}

Derleyici imzaya bakarak _ikinci'nin sonuçtan önce bırakılabileceğini bilir. Fonksiyon gövdesi imzanın vaat ettiğinden fazlasını yapamaz: _ikinci'yi döndürmeye çalışmak derleme hatasıdır.

Uygulama Ayraçtan önce

Yukarıdaki once fonksiyonunu yaz. let metin = "ad=Ece"; için ayracı iç bir blokta String::from("=") olarak oluştur, sonucu bloğun dışındaki bir değişkene ata ve bloktan sonra yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn once<'a>(s: &'a str, ayrac: &str) -> &'a str {
    match s.find(ayrac) {
        Some(i) => &s[..i],
        None => s,
    }
}

fn main() {
    let metin = "ad=Ece";
    let sonuc;
    {
        let a = String::from("=");
        sonuc = once(metin, &a);
    }
    println!("{}", sonuc);
}

Beklenen çıktı

ad

Soru ve cevaplar

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

1 <code>fn f&lt;'a&gt;(x: &amp;str) -&gt; &amp;'a str { let s = String::from("a"); &amp;s }</code> neden derlenmez?

  • Yerel bir değere referans döndürülemez; s fonksiyon sonunda bırakılır Doğru cevap
  • 'a kullanılmamış
  • x kullanılmamış
  • Derlenir

Açıklama: Dönen referans ya bir parametreden gelmeli ya da 'static olmalı. Yeni üretilen veri için String döndür.

2 Yalnızca ilk parametre

Soru
fn once<'a>(s: &'a str, ayrac: ____) -> &'a str {
    match s.find(ayrac) {
        Some(i) => &s[..i],
        None => s,
    }
}
Cevap
fn once<'a>(s: &'a str, ayrac: &str) -> &'a str {
    match s.find(ayrac) {
        Some(i) => &s[..i],
        None => s,
    }
}

Açıklama: Ayraç dönüşe katılmadığı için ömür açıklamasına gerek yoktur.

3 İmza ve anlamı

Kavram Anlamı
(x: &'a str, y: &'a str) -> &'a str Dönüş ikisine bağlı
(x: &'a str, y: &str) -> &'a str Dönüş yalnızca x'e bağlı
fn f(x: &str) -> String Ömür gerekmez
fn f<'a>() -> &'a str Yalnızca 'static olabilir

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