The Borrow Checker: Yeni Başlayanların Korkulu Rüyasını Anlamak

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Top Poster Of Month
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Rust öğrenmeye başlayan neredeyse herkesin yolu bir noktada o meşhur "derleme hatası" duvarına çarpar. Bu duvarın bekçisi Borrow Checker (Ödünç Alma Denetçisi), Rust’ın en güçlü ama yeni başlayanları en çok terleten özelliğidir.

Aslında Borrow Checker size düşman değil; sadece sizin bellekte hata yapmanıza izin vermeyen, çok titiz bir öğretmendir. Gelin, bu "korkulu rüya"nın mantığını kavrayalım.


1. Borrow Checker Neden Var?​

C veya C++ gibi dillerde bir bellek adresini (pointer) bir değişkene atayabilir, sonra o belleği silebilir, ancak hala o eski adrese erişmeye çalışabilirsiniz. Bu durum Dangling Pointer (Sarkan İşaretçi) veya Segmentation Fault hatalarına yol açar.

Borrow Checker, kodunuz derlenirken şu iki soruyu sorar:

  1. Bu veri hala yaşıyor mu?
  2. Aynı anda birden fazla kişi bu veriyi değiştirmeye mi çalışıyor?
Eğer cevaplar güvenli değilse, Rust programınızı asla çalıştırmaz.


2. Borrow Checker'ın İki Altın Kuralı​

Borrow Checker'ın tüm mantığı şu iki kural üzerine kuruludur:

  1. İstediğiniz kadar değişmez (immutable) referans alabilirsiniz (&T). Yani aynı anda birçok kişi veriyi okuyabilir.
  2. Aynı anda SADECE BİR tane değiştirilebilir (mutable) referans alabilirsiniz (&mut T).

3. Yaygın Hata Senaryosu: Okurken Yazmaya Çalışmak​

Yeni başlayanların en sık aldığı hata, bir veriyi hem birine okuması için verip hem de o sırada değiştirmeye çalışmaktır.

Kod:
fn main() {

let mut liste = vec![1, 2, 3];

let ilk_eleman = &amp;liste[0]; // liste'den bir parçayı ödünç aldık (immutable)<br><br>liste.push(4); // HATA! liste'yi değiştirmeye çalışıyoruz.<br><br>println!("İlk eleman: {}", ilk_eleman); <br>
}

Neden Hata Veriyor?

Çünkü liste.push(4) komutu, bellekteki listenin kapasitesini aşarsa, Rust listenin tamamını bellekte başka bir yere taşıyabilir. Bu durumda ilk_eleman artık geçersiz (eski) bir adresi işaret ediyor olurdu. Borrow Checker bunu fark eder ve sizi korur.


4. Yaşam Süresi (Lifetimes)​

Borrow Checker'ın bir diğer görevi de referansların, işaret ettikleri veriden daha uzun yaşamamasını sağlamaktır.

Kod:
let r;

{

let x = 5;

r = &x; // x bu bloğun sonunda ölecek

}

// println!("{}", r); // HATA! r'nin işaret ettiği veri (x) artık yok.

Burada r değişkeni, x'ten daha uzun yaşadığı için derleyici "Sarkan Referans" hatası verir.


5. Borrow Checker İle Nasıl Barışılır?​

Borrow Checker ile kavga etmek yerine onunla iş birliği yapmanın yolları şunlardır:

  • Veriyi Kopyalayın (.clone()): Eğer sahiplik veya ödünç alma kuralları çok karmaşık gelirse, verinin bir kopyasını oluşturun. (Performans maliyeti olsa da başlangıç için iyidir).
  • Kapsamları Küçültün: Süslü parantezler { } kullanarak referansların ömrünü sınırlayın. Böylece işi biten referans ölür ve veri tekrar değiştirilebilir hale gelir.
  • Hata Mesajlarını Okuyun: Rust derleyicisi dünyadaki en yardımsever hata mesajlarına sahiptir. Genelde size tam olarak hangi satırda hata yaptığınızı ve nasıl düzeltebileceğinizi söyler.

Özet​

Borrow Checker, çalışma zamanında (runtime) programınızın çökmesini engelleyen statik bir analiz aracıdır. Başlangıçta size engel çıkarıyormuş gibi görünse de aslında sizi saatlerce sürecek "debug" süreçlerinden kurtarır. Rust topluluğunda söylendiği gibi: "Derleyici ile savaşırsanız kaybedersiniz, ama onu dinlerseniz kazanırsınız."
 
Geri
Üst