CodeBlanks Logo Icon CodeBlanks

Sahiplik nedir?

Sahiplik (ownership) kurallarının ne işe yaradığını öğrenirsin.

Sahiplik nedir?

Sahiplik Rust'ın bellek yönetim modelidir ve üç kurala dayanır:

  • Her değerin bir sahibi vardır (bir değişken).
  • Aynı anda yalnızca bir sahip olabilir.
  • Sahip kapsam dışına çıkınca değer otomatik olarak bırakılır (drop).
{
    let s = String::from("merhaba");  // s sahip
    println!("{s}");
}   // kapsam bitti: s drop edilir, bellek serbest

Çöp toplayıcı yoktur ve elle free yazılmaz; derleyici bırakma noktasını kendisi yerleştirir.

Drop trait'i

Bir türe Drop uygulayarak bırakılırken ne olacağını görebilirsin; dosya kapatma, kilit açma gibi temizlikler böyle otomatikleşir:

struct Kaynak(&'static str);

impl Drop for Kaynak {
    fn drop(&mut self) {
        println!("{} bırakıldı", self.0);
    }
}

let _a = Kaynak("a");
let _b = Kaynak("b");
// kapsam sonu: önce b, sonra a bırakılır (ters sıra)

Uygulama Bırakma sırası

Yukarıdaki Kaynak türünü ve Drop uygulamasını yaz. main içinde let _a = Kaynak("a");, let _b = Kaynak("b"); tanımla ve println!("main bitiyor"); yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
struct Kaynak(&'static str);

impl Drop for Kaynak {
    fn drop(&mut self) {
        println!("{} bırakıldı", self.0);
    }
}

fn main() {
    let _a = Kaynak("a");
    let _b = Kaynak("b");
    println!("main bitiyor");
}

Beklenen çıktı

main bitiyor
b bırakıldı
a bırakıldı

Soru ve cevaplar

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

1 Bir <code>String</code>'in belleği ne zaman serbest bırakılır?

  • Program bitince
  • GC çalışınca
  • free çağrılınca
  • Sahibi kapsam dışına çıkınca Doğru cevap

Açıklama: Kapsamın sonunda derleyici drop çağrısını otomatik ekler; bu, C++'taki RAII fikrinin Rust karşılığıdır.

2 Temizlik yöntemi

Soru
impl Drop for Dosya {
    fn ____(&mut self) {
        println!("kapatıldı");
    }
}
Cevap
impl Drop for Dosya {
    fn drop(&mut self) {
        println!("kapatıldı");
    }
}

Açıklama: Drop trait'inin tek yöntemi drop'tur ve kapsam sonunda çağrılır.

3 Kural

Kavram Anlamı
Bir sahip Her değer için
Kapsam sonu Otomatik drop
Drop trait Özel temizlik
Ters sıra Son tanımlanan önce bırakılır

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