Rust'ın Sahiplik Sistemi: Ownership Nedir?
Ama bu ownership kuralı sadece başta basit gibi görünebilir. Çünkü, Rust'ın kendine özgü kuralları var. Sahiplik değiştirilemez, kopyalanamaz veya serbest bırakılmadan başka bir yere devredilemez.
# Sahiplik Hatası: "Eşdeğer Değerlerin Kopyalanması"
Örneğin, aşağıdaki Rust kodu ile bu hatayı gösterelim:
fn main() {
let s1 = String::from("Merhaba Rust!");
let s2 = s1; // s1'ın sahipliği s2'ye geçti
println!("{}", s1); // Hata! s1 artık geçersiz
}
Yukarıdaki kodda, s1'in sahip olduğu String değeri s2'ye taşınır. Bu durumda, s1'i kullanmaya çalışmak bir hata meydana getirir çünkü Rust, sahipliğin sadece bir yerde olduğunu garanti eder.
Borrowing Nedir?
Immutable Borrowing (değiştirilemez ödünç alma) ve Mutable Borrowing (değiştirilebilir ödünç alma) olmak üzere iki tür borrowing vardır.
# Immutable Borrowing Hatası: "Çoklu Referans"
fn main() {
let s = String::from("Merhaba Dünya");
let s1 = &s; // Immutable borrow
let s2 = &s; // Immutable borrow
println!("{} ve {}", s1, s2); // Hata: Aynı değere birden fazla immutable borrow yapılmaz
}
Bu durumda, Rust, `s`'i aynı anda iki referansla ödünç almayı yasaklar çünkü bu, veri tutarlılığı açısından risklidir.
# Mutable Borrowing Hatası: "Sahiplik Kilidi"
İşte buna dair bir örnek:
fn main() {
let mut s = String::from("Rust Öğreniyorum");
let s1 = &s; // Immutable borrow
let s2 = &mut s; // Mutable borrow yapılmaya çalışılıyor
println!("{}", s2); // Hata! Aynı anda mutable ve immutable borrows yapılamaz
}
Yukarıdaki örnekte, önce `s`'i immutable bir şekilde ödünç alıyoruz, sonra mutable olarak ödünç almaya çalışıyoruz. Bu, Rust'ın borçlanma kurallarına aykırıdır, çünkü veri aynı anda hem değiştirilebilir hem de okunabilir olamaz.
Ownership ve Borrowing Hatalarını Çözme Yöntemleri
1. Değer Taşımadan Önce Kopyalama: Eğer değeri taşımanız gerekiyorsa, `clone()` fonksiyonunu kullanarak kopyalayabilirsiniz. Ancak bu, performans açısından maliyetli olabilir.
2. Refaktoring Yapmak: Rust, kodunuzu refaktör etmeniz için çok güçlü bir dil. Eğer bir değer üzerinden birden fazla referans gerekiyorsa, kodu yeniden düzenleyerek bu hatayı önleyebilirsiniz.
3. RefCell ve Rc Kullanmak: Eğer bir veriyi paylaşmanız ve mutasyona uğratmanız gerekiyorsa, `RefCell` ve `Rc` gibi Rust yapıları kullanabilirsiniz.
Örnek olarak, `RefCell` kullanarak mutable borçlanmayı şu şekilde çözebilirsiniz:
use std::cell::RefCell;
fn main() {
let s = RefCell::new(String::from("Rust'ta Programlama"));
let s1 = s.borrow(); // Immutable borrow
let s2 = s.borrow_mut(); // Mutable borrow
println!("{}", s2); // Hata! Aynı anda immutable ve mutable borrows yapılmaz
}
Sonuç
Rust dilindeki bu hatalar, bazen biraz can sıkıcı olsa da, son derece öğreticidir. Sabırlı olun, her hata, sizi daha iyi bir geliştirici yapacaktır.