CodeBlanks Logo Icon CodeBlanks

Özet - Akıllı işaretçiler

Box ve Rc'yi birleştirerek bir ağaç veri yapısı yazarsın.

Akıllı işaretçiler özeti

Akıllı işaretçiler veriyi heap'te tutan ve ek davranış taşıyan türlerdir. Box<T>: tek sahip, özyinelemeli türler ve dyn Trait için. Rc<T>: tek thread'de paylaşılan sahiplik. Arc<T>: thread'ler arasında paylaşılan sahiplik. Deref onları içerdikleri değer gibi kullanmayı, Drop ise kapsam sonunda temizlik yapmayı sağlar.

Drop trait'i

Drop, bir değer bırakılırken çalışacak kodu tanımlar: dosya kapatmak, bağlantı sonlandırmak, kilit açmak. Elle çağrılmaz; erken bırakmak için drop(x) fonksiyonu kullanılır:

struct Kaynak {
    ad: &'static str,
}

impl Drop for Kaynak {
    fn drop(&mut self) {
        println!("kapatıldı: {}", self.ad);
    }
}

Bu desene RAII denir: kaynak, onu tutan değerin ömrüne bağlanır ve unutulması imkânsız hale gelir.

Uygulama Bırakma sırası

Yukarıdaki Kaynak türünü ve Drop uygulamasını yaz. main'de _a ("a") oluştur; iç blokta _b ("b") oluşturup iç blok yazdır; bloktan sonra son yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
struct Kaynak {
    ad: &'static str,
}

impl Drop for Kaynak {
    fn drop(&mut self) {
        println!("kapatıldı: {}", self.ad);
    }
}

fn main() {
    let _a = Kaynak { ad: "a" };
    {
        let _b = Kaynak { ad: "b" };
        println!("iç blok");
    }
    println!("son");
}

Beklenen çıktı

iç blok
kapatıldı: b
son
kapatıldı: a

Soru ve cevaplar

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

1 Değerler kapsamdan hangi sırayla bırakılır?

  • Tanımlanma sırasının tersiyle Doğru cevap
  • Tanımlanma sırasıyla
  • Rastgele
  • Boyuta göre

Açıklama: Sonra tanımlanan değer önceki değere bağlı olabileceği için önce o bırakılır (stack düzeni).

2 Temizlik metodu

Soru
impl Drop for Kaynak {
    fn drop(____) {
        println!("kapatıldı: {}", self.ad);
    }
}
Cevap
impl Drop for Kaynak {
    fn drop(&mut self) {
        println!("kapatıldı: {}", self.ad);
    }
}

Açıklama: Drop::drop, &mut self alır.

3 Tür ve kullanım yeri

Kavram Anlamı
Box<T> Özyinelemeli tür
Rc<T> Graf düğümü paylaşımı
Arc<T> Thread'ler arası veri
impl Drop Kaynak temizliği

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