"Cannot Borrow Immutable Twice" Hatası Nedir?
Rust’ın sahiplik ve borç alma sistemi, onu diğer dillerden ayıran en önemli özelliklerinden biridir. Rust’ta bir değeri bir kez ödünç alabilirsiniz. Fakat bir değer bir kez mutlak olarak ödünç alındığında ya da birden fazla yerde aynı anda ödünç alınmaya çalışıldığında işler karışır. İşte burada, “Cannot borrow immutable twice” hatası devreye girer.
Hata Örneği ile Durumu Anlayalım
Farz edelim ki bir `Vec` üzerinde işlem yapıyorsunuz ve aynı anda iki farklı yerde immutable borç almayı deniyorsunuz. İşte size o meşhur hata örneği:
fn main() {
let v = vec![1, 2, 3];
let first = &v[0]; // İlk immutable borç al
let second = &v[1]; // İkinci immutable borç alma denemesi
println!("First: {}, Second: {}", first, second);
}
Yukarıdaki örnekte, `v` vektörünün iki farklı elemanına aynı anda immutable borç almak istiyoruz. Ancak Rust, bu durumu kabul etmez ve programı derlerken bize şu hatayı verir:
```
error[E0502]: cannot borrow `v` as immutable because it is also borrowed as immutable
```
Hata Neden Ortaya Çıkar?
Rust, programın çalışma zamanında bir değer üzerinde çifte okuma işlemine karşı koruma sağlar. Bu, aynı nesneye birden fazla okuma yapılırken, herhangi birinin veri üzerinde değişiklik yapıp yapmadığını kontrol etmek için önemlidir. Çünkü birden fazla immutable referans olması, diğerinin veri üzerinde değişiklik yapma riskini doğurabilir. Bu nedenle, Rust yalnızca tek bir immutable referansa izin verir. Eğer daha fazla immutable referansa ihtiyacınız varsa, bunları birbirinden ayırmak gerekir.
Bu hatayı çözmek için basitçe iki seçenek vardır:
# 1. Tek Bir Immutable Borç Kullanmak
Bir nesneye sadece bir immutable referans kullanarak erişebilirsiniz. Bu, Rust’ın borrow checker'ına saygı göstermek anlamına gelir.
fn main() {
let v = vec![1, 2, 3];
let first = &v[0]; // İlk immutable borç al
let second = &v[1]; // Bu satırı silin
println!("First: {}", first);
}
# 2. Değişkeni Kopyalamak
Eğer gerçekten birden fazla değere ihtiyacınız varsa, bir referans yerine bir kopyasını alabilirsiniz. Bu sayede birden fazla immutable referans kullanabilirsiniz.
fn main() {
let v = vec![1, 2, 3];
let first = v[0]; // Kopya al
let second = v[1]; // Diğer kopya
println!("First: {}, Second: {}", first, second);
}
Burada dikkat edilmesi gereken nokta, değerlerin kopyalanması durumunda aslında orijinal vektöre ait bir referans almadığımız için, `v` üzerinde başka bir işlem yapmanıza da engel olunmamış olur.
İyi Bir Uygulama: Rust'ta “Borrowing” Konusunu Anlamak
Rust’ta borç alma (borrowing) konusu biraz kafa karıştırıcı olabilir, ancak bu sisteme alıştığınızda yazdığınız kodun daha güvenli ve daha hızlı çalıştığını göreceksiniz. Bu borç alma mantığı, veri güvenliğini sağlamak ve aynı anda yapılan değişikliklerden kaynaklanan hata risklerini ortadan kaldırmak için mükemmel bir yoldur.
Eğer Rust ile uğraşıyorsanız, borç alma denetleyicisiyle tanışmanız kaçınılmaz. “Cannot borrow immutable twice” hatası, başlangıçta zorlu gibi görünebilir ama aslında, programın güvenliğini sağlamak adına çok önemli bir uyarıdır. Yapmanız gereken tek şey, bir nesnenin aynı anda birden fazla yerde değiştirilemez (immutable) referans almasına izin vermemek ve Rust’ın borç verme kurallarına sadık kalmak.
Umarım bu yazı, karşılaştığınız bu hata hakkında sizi biraz daha bilgilendirebilmiştir. Rust’ın borçlama sistemine alıştığınızda, daha güvenli ve tutarlı yazılımlar geliştirebilirsiniz. Şimdi, Rust’ı daha derinlemesine keşfetmeye devam edin ve bu hatanın bir engel değil, öğretici bir fırsat olduğunu unutmayın!