CodeBlanks Logo Icon CodeBlanks

Dangling referans

Askıda referans (dangling) oluşumunu önleyen mekanizmayı öğrenirsin.

Dangling referans

Sarkan (dangling) referans, artık var olmayan bir değeri gösteren referanstır. C ve C++'ta sık görülen bu hata Rust'ta derleme anında engellenir:

fn sarkan() -> &String {     // hata: ömür belirtilmemiş
    let s = String::from("geçici");
    &s                        // s burada drop edilir!
}

Çözüm, referans yerine değerin kendisini döndürmektir: fn yeni() -> String { String::from("geçici") }. Böylece sahiplik çağırana geçer.

Kapsamlar arası referans

Aynı hata iç bloklarda da yakalanır:

let r;
{
    let x = 5;
    r = &x;          // hata E0597: x yeterince uzun yaşamıyor
}
// println!("{r}");

Hata mesajı "borrowed value does not live long enough" der ve x'in nerede bırakıldığını gösterir. Değer dış kapsama taşınınca sorun çözülür.

Uygulama Güvenli dönüş

fn mesaj_uret(ad: &str) -> String yaz; format!("Hoş geldin, {ad}") döndürsün (referans değil). mesaj_uret("Ece") sonucunu yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn mesaj_uret(ad: &str) -> String {
    format!("Hoş geldin, {ad}")
}

fn main() {
    println!("{}", mesaj_uret("Ece"));
}

Beklenen çıktı

Hoş geldin, Ece

Soru ve cevaplar

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

1 Borrow checker neyi garanti eder?

  • Programın hızlı çalışmasını
  • Bellek sızıntısı olmamasını her durumda
  • Kodun derlenmesini
  • Her referans, gösterdiği değerden uzun yaşamaz Doğru cevap

Açıklama: Derleyici her referansın ömrünü (lifetime) değerin ömrüyle karşılaştırır; uzun yaşayan referans derleme hatasıdır.

2 Değeri döndür

Soru
fn yeni_mesaj() -> ____ {
    String::from("merhaba")
}
Cevap
fn yeni_mesaj() -> String {
    String::from("merhaba")
}

Açıklama: Değerin kendisini döndürmek sahipliği aktarır; sarkan referans oluşmaz.

3 Hata kodu ve anlamı

Kavram Anlamı
E0382 Taşınmış değer kullanıldı
E0499 İki &mut
E0502 Okurken yazma
E0597 Değer yeterince yaşamıyor

Başlangıç bölümündeki tüm dersler

16 Proje: Yapılacaklar listesi

  1. Görev modeli
  2. Ekleme
  3. Listeleme
  4. İşaretleme
  5. Komut okuma