Borrow Checker Nedir?
Rust’ın en dikkat çeken özelliklerinden biri, bellek güvenliği sağlar. Diğer dillerde bellek yönetimini programcıya bırakırken, Rust bu sorumluluğu büyük ölçüde kendisi alır. Ancak, bu güvenlik sağlanırken geliştiricinin kafası karışabilir. İşte burada borrow checker devreye girer.
Borrow Checker Error: Neden Olur?
Bir `borrow checker error` hatası aldığınızda, bu hatanın genellikle birkaç yaygın sebebi vardır. Hadi, bu sebepleri birlikte inceleyelim.
Rust'ta bir veriyi sadece bir sahip alabilir. Eğer bir veri birden fazla değişken tarafından sahiplenilmeye çalışılırsa, borrow checker hemen bir hata verir. Bu, iki değişkenin aynı veri üzerinde aynı anda sahip olamayacağını anlatan bir hatadır.
Örnek kod:
fn main() {
let mut x = 5;
let y = &mut x;
let z = &mut x; // Borrow checker hatası!
println!("{}", y);
}
Yukarıdaki kodda, `x` değişkeni hem `y` hem de `z` tarafından mutable (değiştirilebilir) olarak borçlanmaya çalışılıyor. Rust, bu hatayı tespit eder ve programın doğru şekilde çalışmasını engeller.
# 2. Çift Referans Hatası
Rust, aynı anda yalnızca bir mutable (değiştirilebilir) referansın olmasına izin verir. Fakat eğer bir değişkeni hem mutable hem de immutable (değiştirilemez) bir referansla borçlanmaya çalışırsanız, yine bir hata alırsınız.
fn main() {
let mut x = 5;
let y = &x; // Immutable borrow
let z = &mut x; // Mutable borrow error!
}
Burada `y` değişkeni `x`'i immutable olarak borçlarken, `z` değişkeni de `x`'i mutable olarak borçlanmaya çalışıyor. Bu, Rust’ın borçlanma kurallarına aykırıdır ve bir hata meydana gelir.
# 3. Sahipliğin Geçişi
Rust’ta bir değişkenin sahipliği, yalnızca bir kez ve tek yönlü olarak geçebilir. Eğer bir değişkeni başka bir değişkene aktarırsanız, ilk değişkeni kullanmak artık mümkün olmaz.
fn main() {
let x = vec![1, 2, 3];
let y = x; // x'ın sahipliği y'ye geçiyor
println!("{:?}", x); // Borrow checker hatası!
}
Yukarıdaki örnekte `x`’in sahipliği `y` değişkenine geçtiği için, `x` değişkenine tekrar erişmeye çalışmak hatalı olacaktır.
Bu Hataları Nasıl Çözersiniz?
Her zaman hatırlamanız gereken şey, Rust’ın sahiplik ve borçlanma kurallarını düzgün bir şekilde takip etmeniz gerektiğidir. Hataları çözmek için:
2. Sahipliği doğru yönlendirin: Eğer bir değişkenin sahipliğini bir diğerine veriyorsanız, eski değişkeni artık kullanamazsınız.
3. Veri yaşam döngülerine dikkat edin: Verilerin ne zaman ve nasıl kullanılacağına dikkat edin, bu sayede borrow checker hatalarını önleyebilirsiniz.
Örnek çözüm:
fn main() {
let mut x = 5;
let y = &mut x; // Sadece bir mutable referans
println!("{}", y);
}
Yukarıdaki kod artık doğru bir şekilde çalışacaktır. `x` değişkeni yalnızca bir mutable referans ile borçlanmıştır ve bu da Rust’ın kurallarına uygun bir kullanım örneğidir.