Hayal edin, her şey yolunda gidiyor. Rust’ta yazdığınız kod, size kararlı bir şekilde başını sallayarak “Evet, işte buradayım. Beni yaz, çalıştır ve harika sonuçlar al.” diyor. Ancak sonra bir hata alırsınız. Gözlerinizin önünde beliriveren hata mesajını okurken derin bir nefes alırsınız: *“Eyvah, Borrow Checker Error!”* Kafanızda bir dizi soru işareti belirir: “Bu ne demek? Ne oldu? Nereye yanlış yazdım?”
Hadi gelin, bu hatanın ne olduğunu, neden ortaya çıktığını ve nasıl çözüleceğini birlikte keşfedelim.
Rust'un Borrow Checker'ı Ne İşe Yarar?
Fakat işler bazen karmaşıklaşabilir. İşte burada *borrow checker* devreye girer. Eğer borç alırken (ya da sahipliği paylaşıyorken) bir hata yaparsanız, bu kuralı ihlal edersiniz. Rust, bunu anlamanızı sağlayacak şekilde bir hata mesajı gösterir.
Borrow Checker Hatası Nedir?
1. Bir veri yalnızca bir kez *mutable* (değiştirilebilir) olmalıdır.
2. Aynı veriye aynı anda yalnızca birden fazla *immutable* (değiştirilemez) referans olabilir, ya da bir *mutable* referans olabilir.
Eğer bu kurallardan birini ihlal ederseniz, *borrow checker* hemen devreye girer ve bir hata mesajı gösterir. İşte size basit bir örnek:
fn main() {
let mut x = 5;
let y = &x; // Immutable borrow
let z = &mut x; // Mutable borrow (hata!)
}
Yukarıdaki örnekte, ilk satırda bir *mutable* değişken olan `x` tanımlanıyor. Ardından, `x`'in *immutable* bir referansı olan `y` oluşturuluyor. Ancak sonrasında `x`'in *mutable* referansı olan `z` tanımlanıyor. Bu, Rust’un sahiplik ve borç verme kurallarına aykırıdır. Çünkü bir veri aynı anda hem *immutable* hem de *mutable* olarak borç verilemez. Bu yüzden *borrow checker* bu hatayı yakalar ve aşağıdaki gibi bir hata mesajı alırsınız:
```
error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable
```
Bu hata, Rust’un güvenlik özelliklerinden yalnızca birine örnektir ve bellek hatalarını önlemenin ne kadar güçlü bir yoludur.
Borrow Checker Hatasını Nasıl Çözersiniz?
Burada çözüm, *mutable* referansı sadece bir kez kullanmaktır. Örneğin, şöyle düzeltebilirsiniz:
fn main() {
let mut x = 5;
let y = &x; // Immutable borrow
// `x`'i mutable olarak değiştirmeden önce `y`'i kullanmalısınız
println!("y: {}", y);
let z = &mut x; // Mutable borrow (şimdi geçerli!)
*z += 1;
println!("z: {}", z);
}
Bu düzeltme, ilk referansın kullanımını bitirdikten sonra `x` üzerinde *mutable* işlem yapmanıza olanak tanır. Artık `borrow checker` tarafından hata almazsınız çünkü kurallar doğru bir şekilde izlenmiştir.
Rust ile Borç Verme: Bir Macera
İlk başta bu hatalar sizi boğabilir, ancak onlarla yüzleşmek, sonunda Rust dilinde ustalaşmanıza yardımcı olur. Bu yazıyı okuduktan sonra, *borrow checker* hatalarını daha iyi anlamanızı umarım. Rust’un sağladığı bu güvenlik katmanı sayesinde daha sağlam, güvenli ve hatasız yazılımlar yazmaya devam edebilirsiniz.