Ownership Nedir?
Rust, bellek güvenliğini sağlamak için "ownership" (sahiplik) modelini kullanır. Bu model, bir değişkenin yalnızca bir sahibi olabileceğini ve sahibinin değişkenin belleğini kontrol ettiğini belirtir. Başka bir deyişle, değişkenin sahipliği başka bir değişkene aktarılabilir, ancak bu aktarım bir "borrowing" (ödünç alma) işlemi gerektirir.
Borrowing Hatası Nedir?
Rust, değişkenlerin hem mutable (değiştirilebilir) hem de immutable (değiştirilemez) olarak ödünç alınabilmesini sağlar. Ancak burada önemli bir kısıtlama vardır: Bir değişken aynı anda yalnızca bir kez mutable olarak ödünç alınabilir ve birden fazla immutable olarak ödünç alınabilir, ancak bir mutable ödünç alma işlemi varsa, başka hiçbir ödünç alma işlemi yapılamaz. Bu kısıtlama, kodun doğru şekilde çalışmasını ve bellek hatalarının önüne geçilmesini sağlar.
Ancak bir gün kodunuzda aşağıdaki gibi bir hata alırsanız:
fn main() {
let s1 = String::from("Merhaba");
let s2 = &s1; // immutable borrow
let s3 = &s1; // immutable borrow
let s4 = &mut s1; // mutable borrow - Error!
println!("{}", s2);
println!("{}", s3);
}
Derleyici size şöyle bir hata verecektir:
```
error[E0502]: cannot borrow `s1` as mutable because it is also borrowed as immutable
```
Bu, Rust'ın sahiplik kuralına göre aynı anda hem immutable hem de mutable ödünç alma yapmanıza izin vermediğini belirtir.
Çözüm: Nasıl Düzeltilir?
Bu hatanın çözümü oldukça basittir. Değişkeninizi sadece bir türde ödünç alın. Yani, ya tüm ödünç alma işlemlerini immutable yapın ya da sadece bir mutable ödünç alma işlemi kullanın. İşte bu hatayı çözen örnek:
fn main() {
let s1 = String::from("Merhaba");
let s2 = &s1; // immutable borrow
let s3 = &s1; // immutable borrow
println!("{}", s2);
println!("{}", s3);
// Mutable borrow işlemi sonrasında yapılmalı
let s4 = &mut s1; // mutable borrow
println!("{}", s4);
}
Bu şekilde, mutable ödünç alma işlemi yalnızca diğer ödünç almalar sona erdikten sonra yapılabilir.
Rust’ın Sahiplik Kuralları: Anlamanızı Kolaylaştıracak İpuçları
Rust'ın sahiplik kuralları biraz zorlayıcı olabilir, ancak onları tam anlamadan güvenli ve etkili bir şekilde kod yazmak zor olacaktır. İşte birkaç ipucu:
- Sahipliği Takip Et: Bir değişkenin sahipliği başka bir değişkene geçtiğinde, eski değişken artık geçerli bir değeri tutmaz.
- Değişkenlerin Ödünç Alınmasını Anlamak: Rust, yalnızca bir mutable ödünç almaya izin verir. Aynı anda birden fazla immutable ödünç alınabilir.
- Kopyalanabilir Tipler: Eğer değeriniz kopyalanabilirse (mesela `Copy` trait'ine sahipse), o zaman değer otomatik olarak kopyalanır ve ödünç alınma kuralları devreye girmez.
Sonuç: Rust ile Güvenli Kod Yazmanın Yolu
Rust, başlangıçta korkutucu görünebilir, ancak sahiplik ve borrowing kurallarını kavradığınızda, size büyük bir esneklik ve güvenlik sunar. Eğer kod yazarken sürekli olarak "Ownership Borrowing Error" ile karşılaşırsanız, bu hatayı doğru çözebilmek için sahiplik ve ödünç alma kavramlarını tamamen anlamanız gerektiğini unutmayın.
Her hata, aynı zamanda bir öğrenme fırsatıdır. Bu hatayı çözerken, Rust dilinin nasıl çalıştığını daha iyi anlayacak ve daha sağlam ve güvenli bir kod yazacaksınız.