Ownership ve Borrowing: Rust'ın Temel Taşları
Rust'ta bellek yönetimi, sahiplik (ownership) ve ödünç alma (borrowing) kurallarına dayanır. Bu kurallar, bellek sızıntılarını ve veri yarışlarını önlemeye yardımcı olur. Hadi önce bu kavramları kısa bir şekilde gözden geçirelim:
- Ownership: Bir veri parçasının yalnızca bir sahibi vardır. Bu sahiplik, veri hayatı boyunca değiştirilemez.
- Borrowing: Bir veri parçası, başka bir işlev veya değişken tarafından ödünç alınabilir, ancak ödünç almanın da kuralları vardır. Bir veri parçası, ya mutlak sahiplikte olmalı ya da yalnızca ödünç verilmelidir, ancak her ikisi aynı anda olamaz.
Ownership ve Borrowing Hatalarına Genel Bakış
Rust’ta en yaygın hatalardan bazıları, yanlış ownership ve borrowing kullanımı sonucu oluşur. Bu hataların en sık görülenleri:
- Value moved error: Bir değer, bir değişkene veya işleve taşındığında, önceki değişkenden "silinir". Bu durum, aynı veriyi birden fazla kez kullanmaya çalıştığınızda karşınıza çıkar.
- Cannot borrow `x` as mutable because it’s also borrowed as immutable: Bir veri parçası hem "mutable" (değiştirilebilir) hem de "immutable" (değiştirilemez) olarak ödünç alındığında bu hatayı alırsınız.
Şimdi, bu hataların neden oluştuğunu ve nasıl çözüleceğini daha detaylı inceleyelim.
Value Moved Error: Rust'ın Size Sınırları
Rust’ın sahiplik modeli, bir veri parçasının yalnızca bir sahibinin olmasına izin verir. Bu, bir değer başka bir değişkene atandığında o değerin hareket ettiği anlamına gelir. Örneğin:
fn main() {
let x = String::from("Merhaba Rust!");
let y = x; // x burada moved oluyor
println!("{}", x); // Hata! x artık geçerli değil
}
Yukarıdaki örnekte, `x` değişkeni `y`'ye atandığında, `x`'in değeri "move" olur ve artık geçerli değildir. Bu, Rust’ın sahiplik kurallarından biridir. Rust, bellek güvenliği sağlamak için bir değerin birden fazla yerde kullanılmasını engeller. Bu hata, kodu yazarken dikkat edilmesi gereken önemli bir nokta.
Çözüm: Eğer veriyi birden fazla yerde kullanmak istiyorsanız, onu "borrow" etmeniz gerekecek. Bunu, veri üzerinde sahipliği kaybetmeden sadece ödünç alarak yapabilirsiniz.
fn main() {
let x = String::from("Merhaba Rust!");
let y = &x; // x burada sadece ödünç alınıyor
println!("{}", x); // Bu geçerli çünkü x "borrowed" durumda
println!("{}", y); // Ve y, x'in ödünç alınmış halini kullanıyor
}
Cannot Borrow Mutably and Immutably at the Same Time
Rust’ta bir değeri hem immutable (değiştirilemez) hem de mutable (değiştirilebilir) olarak ödünç almak aynı anda mümkün değildir. Aşağıdaki kodda bu hatayı alırsınız:
fn main() {
let mut x = String::from("Rust öğreniyorum");
let y = &x; // x'e immutable borç
let z = &mut x; // Hata! x zaten immutable olarak borç alındı
println!("{}", y);
println!("{}", z);
}
Bu durumda, Rust derleyicisi, bir değerin hem mutable hem de immutable olarak ödünç alınmasını engeller. Bu kural, verilerin eşzamanlı erişiminde oluşabilecek veri yarışlarını engeller ve programın güvenliğini sağlar.
Çözüm: Aynı anda bir değişkeni hem immutable hem de mutable olarak ödünç almazsınız. İhtiyacınız olan veriyi sadece bir şekilde ödünç alın.
fn main() {
let mut x = String::from("Rust öğreniyorum");
let y = &x; // x'e immutable borç
println!("{}", y);
let z = &mut x; // z'yi ancak y'nin kullanımı bittiğinde alabilirsiniz
z.push_str(" ve çok eğlenceli!");
println!("{}", z);
}
Sonuç: Rust’ta Sahiplik ve Ödünç Almayı Öğrenmek
Rust’ın sahiplik ve ödünç alma kuralları başlangıçta karmaşık gibi görünebilir. Ancak, bu kurallar programlarınızda bellek hatalarını ve veri yarışlarını önlemeye yardımcı olur. Kod yazarken bu kurallara dikkat etmek, hata yapmanızı engeller ve programınızın daha güvenli çalışmasını sağlar.
Rust'ta ownership ve borrowing hatalarını anlamak, dilin temel taşlarından birini öğrenmek gibidir. Başlangıçta zorlayıcı olabilir, ancak Rust'ın sunduğu güvenlik avantajlarını göz önünde bulundurduğunuzda, bu öğrenme süreci son derece faydalıdır. Eğer Rust ile yeni başlıyorsanız, hata mesajlarını dikkatle okuyun, çünkü bu mesajlar çoğu zaman size neyi yanlış yaptığınızı ve nasıl düzeltebileceğinizi açıkça anlatır.