Drop Özelliği

Drop özelliğini gerçekleştiren (implement) değerler, kapsam (scope) dışına çıktıklarında çalışacak kodu belirtebilirler:

struct Droppable {
    name: &'static str,
}

impl Drop for Droppable {
    fn drop(&mut self) {
        println!("{} düşürülüyor", self.name);
    }
}

fn main() {
    let a = Droppable { name: "a" };
    {
        let b = Droppable { name: "b" };
        {
            let c = Droppable { name: "c" };
            let d = Droppable { name: "d" };
            println!("En içteki bloktan çıkılıyor");
        }
        println!("Sonraki bloktan çıkılıyor");
    }
    drop(a);
    println!("main'den çıkılıyor");
}
This slide should take about 8 minutes.
  • std::mem::drop’un std::ops::Drop::drop ile aynı olmadığını unutmayın.
  • Değerler kapsam dışına çıktıklarında otomatik olarak düşürülür (drop).
  • Bir değer düşürüldüğünde, std::ops::Drop’u gerçekleştiriyorsa, Drop::drop gerçekleştirmesi çağrılır.
  • Drop’u gerçekleştirip gerçekleştirmediğine bakılmaksızın tüm alanları da düşürülür.
  • std::mem::drop sadece herhangi bir değeri alan boş bir fonksiyondur. Önemi, değerin sahipliğini (ownership) almasıdır, bu yüzden kapsamının (scope) sonunda düşürülür (drop). Bu, değerleri normalde kapsam dışına çıkacaklarından daha erken bir zamanda açıkça düşürmenin uygun bir yoludur.
    • Bu, drop üzerinde bir miktar iş yapan nesneler için yararlı olabilir: kilitleri bırakma, dosyaları kapatma vb.

Tartışma noktaları:

  • Drop::drop neden self almaz?
    • Kısa cevap: Eğer alsaydı, bloğun sonunda std::mem::drop çağrılır, bu da Drop::drop’a başka bir çağrıya ve bir yığın taşmasına (stack overflow) neden olurdu!
  • drop(a)’yı a.drop() ile değiştirmeyi deneyin.