Rust'ın Sahiplik ve Borçlanma Düzeni
- Ownership (Sahiplik), bir değişkenin bellekteki belirli bir kaynağı sahiplenmesini sağlar. Bir değişken bir kaynağa sahip olduğunda, başka bir değişken ona erişim sağlayamaz.
- Borrowing (Borçlanma), başka bir değişkenin kaynağa geçici erişimini sağlar. Bu erişim sadece okuma ya da yazma şeklinde olabilir.
Peki, bu sistem ne zaman işler? Bu sistem, bir değişkenin belleği doğrudan yönetmesini engelleyerek, hata yapma olasılığını sıfıra indirir. Ancak burada dikkat edilmesi gereken kritik bir nokta var: Borrowing sırasında doğru kurallara uymak gerekiyor.
Ownership ve Borrowing Hataları
Diyelim ki aşağıdaki gibi bir kod yazdınız:
fn main() {
let s1 = String::from("Merhaba");
let s2 = &s1; // Borrowing: s1'in referansını alıyoruz.
println!("{}", s1); // Burada sorun yok.
println!("{}", s2); // s2'yi yazdırmak da sorun değil.
}
Bu kodda, `s1` değişkeninin borrowing (borçlanma) yapılarak, `s2` değişkenine referans verdiğini görebiliyoruz. Burada herhangi bir problem yok, çünkü `s1` ve `s2` arasında immutable borrow yapılıyor.
Ama gel gelelim, eğer şöyle bir şey yapmaya çalışırsak:
fn main() {
let s1 = String::from("Merhaba");
let s2 = &mut s1; // Mutable borrow yapıyoruz!
println!("{}", s1); // s1'i doğrudan yazdırmaya çalışıyoruz.
}
Bu sefer bir hata alırsınız! Çünkü Rust, mutable borrow’un (değiştirilebilir borçlanma) olduğu yerde, kaynak veriyi başka hiçbir yerde kullanmanıza izin vermez. Yani, `s1` üzerindeki veriye başka bir yerden erişmeye çalışmak, hataya yol açacaktır.
Rust burada çok katı. Bir değişken ya sahiplik (ownership) alır, ya da borçlanır (borrow). Hem sahiplik hem de borçlanma aynı anda olamaz. Eğer bir değişken borç alıyorsa, diğer değişkenler onun üzerinde işlem yapamaz. Bu, çok önemli bir güvenlik özelliğidir.
Hata Çözümü: Sahipliği Yönetmek
fn main() {
let mut s1 = String::from("Merhaba");
let s2 = &mut s1; // Mutable borrow
println!("{}", s2); // s2'yi yazdırıyoruz.
}
Burada `s1` üzerinde mutable borrow yapılıyor, ancak artık başka bir yerden `s1`'i kullanamazsınız. Bu sayede bellekteki kaynak yönetimi düzgün bir şekilde yapılır ve veri güvenliği sağlanır.
Rust'ta Bu Hatalardan Nasıl Kaçınılır?
- Mutable Borrow (Değiştirilebilir Borçlanma): Eğer veriyi değiştirecekseniz, yalnızca bir yerde mutable borrow kullanın. Aynı anda birden fazla referans kullanmak bellekteki kaynakların karışmasına sebep olur.
Sonuç
Eğer bu hatalardan kaçınarak kod yazarsanız, bellek güvenliği konusunda kendinizi güvende hissedebilirsiniz. Bu, uygulamanızın daha stabil ve güvenilir olmasına olanak tanır.