Borrow Checker Nedir?
Bu kontrollerin yapıldığı yer işte o meşhur borrow checker'dır. Ancak bu kurallar, ilk bakışta programcılar için kafa karıştırıcı olabilir.
İlk Borç Alma Hatası: Kodunuzu Sıkıştıran Bir Hata
fn main() {
let mut a = String::from("Merhaba");
let b = &a;
a.push_str(", Dünya!");
}
Yukarıdaki kodda `a` değişkenine bir `String` değeri atanıyor, sonra ise `b` değişkeni `a`'ya bir immutable referans alıyor. Kodda herhangi bir hata yokmuş gibi gözükse de, bir borrow checker hatası alırsınız. Neden mi? Çünkü `a.push_str(", Dünya!");` satırında, `a`'ya bir mutable referans ile yazma yapmaya çalışıyorsunuz, ancak o sırada `a`'ya bir immutable referans (`b`) verilmiş durumda.
Rust, aynı anda bir veri üzerinde hem mutable hem de immutable referansların olmasına izin vermez, çünkü bu bellek hatalarına yol açabilir. İşte bu noktada borrow checker devreye girer ve hatayı bildirir.
Hata Mesajını Anlamak
```
error[E0502]: cannot borrow `a` as mutable because it is also borrowed as immutable
```
Bu hata, Rust'ın borç verme kurallarına aykırı bir şey yapmaya çalıştığınızı belirtir. Burada immutable referans (`b`) ile mutable referansı aynı anda kullanmanız yasaktır. Rust, bunun programda bir bellek hatasına yol açabileceğinden emin olmak ister.
Hata Nasıl Çözülür?
1. Immutable referansın yaşam süresini sonlandırmak: Yani `b`'yi kullanmadan önce, `a` üzerinde değişiklik yapabilmek için `b`'yi serbest bırakmalısınız.
fn main() {
let mut a = String::from("Merhaba");
let b = &a;
println!("{}", b);
a.push_str(", Dünya!");
}
Burada, önce `b`'yi yazdırıp ardından `a.push_str()` fonksiyonunu çağırarak borrow checker'ı kandırmış olduk. Şimdi `a`'nın mutable referansı ile güvenli bir şekilde işlem yapabiliyoruz.
2. Referansların sırasını değiştirmek: Eğer `a`'ya immutable referansı olan `b`'yi kullanmaya ihtiyacınız yoksa, sadece `a.push_str()`'i çağırabilirsiniz. Bu şekilde, veri üzerinde yalnızca bir tür referans bulunur ve hata alınmaz.
fn main() {
let mut a = String::from("Merhaba");
a.push_str(", Dünya!");
let b = &a;
println!("{}", b);
}