Dangling referans
- Rust kursu
- Başlangıç
- Ders 51/115
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
fn yeni_mesaj() -> ____ {
String::from("merhaba")
}
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 |