Rust'ta Ownership: Her Şeyin Başlangıcı
Her veri, bir değişken tarafından "sahiplenilir" ve bu veri yalnızca bu değişken tarafından erişilebilir. Bu, bellek sızıntılarını ve hatalarını önlemek için mükemmel bir yöntemdir. Ancak, bu kadar katı bir bellek yönetimi sistemi bazen başınızı ağrıtabilir.
Ownership Hatası: "Cannot Move Out of Dereferenced"
Rust'un sahiplik (ownership) modelinde, bir değeri başka bir yere taşıdığınızda (move ettiğinizde), orijinal değişken artık o değeri kullanamaz. Bu durumda hata alırsınız. Bu, verilerin birden fazla yerden erişilmesini önlemek amacıyla yapılır. Hangi değişkenin veriyi kontrol edeceği konusunda bir karışıklık olmasın diye Rust, böyle bir hatayı önceden yakalar.
Örneğin aşağıdaki gibi bir kod düşündüğünüzde:
fn main() {
let s = String::from("Hello");
let s2 = s;
println!("{}", s); // Burada 's' artık geçersizdir
}
Yukarıdaki örnekte, `s` değişkenini `s2`'ye aktardığınızda, `s` değişkeni geçersiz hale gelir. Bu yüzden `println!` fonksiyonu, `s`'i kullanmaya çalıştığınızda hata verir. Rust, veriyi taşırken onun bir kopyasını değil, gerçek sahipliğini alır ve `s`'in bu değeri kullanmasına engel olur.
Borrowing: Değişkeni Kopyalamadan Kullanmak
Eğer bir değişkenin değerini sadece okumak istiyorsanız, ona immutable (değiştirilemez) olarak ödünç alabilirsiniz. Örneğin:
fn main() {
let s = String::from("Hello");
let s_ref = &s; // Immutable borç
println!("{}", s_ref); // Sadece okuma yapıyoruz
}
Bu durumda `s_ref`, `s`'in referansıdır ve onu değiştiremezsiniz. Ancak, `s`'in kendisi hala geçerli ve başkaları da `s`'i immutable olarak ödünç alabilir.
Ancak bir değişkeni hem mutlak hem de immutable ödünç almayı denediğinizde, Rust size bir hata verecektir. Çünkü, bir değişkenin birden fazla referansla aynı anda erişilmesi bellek hatalarına yol açabilir.
fn main() {
let mut s = String::from("Hello");
let s_ref = &s; // Immutable borç
let s_mut_ref = &mut s; // Mutable borç, bu hata verir
println!("{}", s_ref);
}
Yukarıdaki kodda `s_mut_ref`'i `s`'in mutable (değiştirilebilir) ödünç alması için kullanmaya çalıştık. Ancak `s_ref`'in bir immutable borç olduğu için, Rust bunu engeller. Aynı anda bir değişkenin hem mutable hem de immutable ödünç alınmasına izin vermez.
Borrowing Hatası: "Cannot Borrow as Mutable Because It's Also Borrowed as Immutable"
Bu hatanın çözümü için referansların yaşam sürelerini ve hangi değişkenin ne zaman ödünç alındığını dikkatlice takip etmeniz gerekmektedir.
Sonuç: Rust'ta Güvenli ve Hatasız Kod Yazmak
Başlangıçta bu hatalar sizi zorlayabilir, ancak her hatadan bir şeyler öğrenirsiniz. Bu sayede, kodunuzun doğru çalışmasını sağlarken bellek hatalarından kaçınabilir ve daha güvenli bir yazılım geliştirebilirsiniz.
###