Özet - Akıllı işaretçiler
- Rust kursu
- Orta seviye
- Ders 35/115
- 5 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
impl Drop for Kaynak {
fn drop(____) {
println!("kapatıldı: {}", self.ad);
}
}
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 |