Rust’a Giriş ve Borrow Checker ile Tanışma
Borrow Checker Nedir?
Rust’ta, bir değeri iki şekilde kullanabilirsiniz: borrowing ve ownership. Eğer bir veriyi sadece okumak istiyorsanız, ona referans (borrow) edebilirsiniz. Ama bir değeri değiştirmek istiyorsanız, ona sahip olmanız (ownership) gerekir. İşte burada *Borrow Checker* devreye girer ve size bu kurallara uymanız gerektiğini hatırlatır.
İlk *Borrow Checker* Hatası
fn main() {
let mut x = String::from("Hello");
let y = &x; // Borrowing x immutably
x.push_str(", World!"); // Trying to modify x while it's borrowed
println!("{}", y);
}
Kodu çalıştırdım ve beklediğim gibi "borrowed value does not live long enough" hatası ile karşılaştım. Bu hata, `x` değerini değiştirmeye çalıştığımda, aynı anda onu borç almış olan `y`'nin hâlâ geçerli olduğuna dair bir uyarıydı. Rust, bir değeri borç alırken, o değerin değiştirilmesine izin vermez.
Bunu düzeltmek için, borçlanan değeri kullanmadan önce ona sahip olmalıydım. Bu da bana hafıza yönetimini nasıl daha etkili kullanabileceğimi öğretti.
Borrowing Kuralları ve Çözüm
- Bir değer bir defa mutable (değiştirilebilir) olarak borç alınabilir, ama o sırada diğer borçlanmalar yasaktır.
- Aynı anda bir değer üzerinde birden fazla immutable borç alınabilir, fakat o sırada değeri değiştirmek mümkün değildir.
Kodumu düzeltmek için, `x.push_str()` fonksiyonunu, `x`'e sahip olduğum bir anda çalıştırdım:
fn main() {
let mut x = String::from("Hello");
let y = &x; // Borrowing x immutably
println!("{}", y);
x.push_str(", World!"); // Now it's fine, because we're no longer borrowing
}
Bu sefer kod sorunsuz bir şekilde çalıştı. Burada dikkat etmem gereken, `x`'i değiştirmeden önce borçlanmanın sona ermesiydi. Rust, borçlanmanın ne zaman bittiğini çok iyi bir şekilde izliyor ve bu kurallar sayesinde hafıza sızıntılarını engelliyor.
Borrow Checker Hatalarını Anlamak
Örneğin, aşağıdaki kodda `x` ve `y` iki farklı değişkendir. Ancak, `y`'yi bir değer olarak almak, `x`'in değerini kaybetmenize yol açabilir:
fn main() {
let x = String::from("Hello");
let y = x; // Ownership moved to y
println!("{}", x); // Error! x is no longer valid
}
Bu tür bir hata, Rust’ın sahiplik modelinin anlaşılması gerektiğini hatırlatır. Eğer `x`'i `y`'ye verdiyseniz, `x`’i kullanamazsınız çünkü artık `y` ona sahip olmuştur.
Sonuç: Rust ile Güvenli ve Etkili Hafıza Yönetimi
Rust dilinin güçlü özelliklerini öğrenmeye devam ettikçe, bu tür hatalarla karşılaşmak daha az korkutucu hale gelir. Aslında, her hata bir öğrenme fırsatıdır ve Rust’ın size sunduğu güvenlik avantajlarını daha iyi anlamanızı sağlar.