- 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.
Borrow Checker, kodunuz derlenirken şu iki soruyu sorar:
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.
Burada r değişkeni, x'ten daha uzun yaşadığı için derleyici "Sarkan Referans" hatası verir.
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:
- Bu veri hala yaşıyor mu?
- Aynı anda birden fazla kişi bu veriyi değiştirmeye mi çalışıyor?
2. Borrow Checker'ın İki Altın Kuralı
Borrow Checker'ın tüm mantığı şu iki kural üzerine kuruludur:- İstediğiniz kadar değişmez (immutable) referans alabilirsiniz (&T). Yani aynı anda birçok kişi veriyi okuyabilir.
- 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 = &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.