Sorunun geçmişi:
Rust'ta sıkça kullanılan koleksiyonlardan biri HashMap — bir hash tablosu ile uygulanmış bir ilişkisel dizidir. Rust uygulamasının farkı, sahiplik ve bellek güvenliği kurallarına sıkı şekilde uyulması ve yalnızca belirli koşullarda thread-güvenli olmasıdır.
Sorun:
Diğer garbage-collection dilleri ile karşılaştırıldığında, Rust'ta HashMap ile yapılan herhangi bir işlem (ekleme, çıkarma, değiştirme), sahiplik kurallarına uyulmasını gerektirir. Örneğin, içeriğine aktif referanslar varken koleksiyonu değiştirmek mümkün değildir. Ekleme sırasında sahiplik sorunu da ortaya çıkar: elemanlar ya taşınır ya da kopyalanır. Eşzamanlı erişim durumunda data race riski vardır.
Çözüm:
get_mut veya entry API’si aracılığıyla.Kod örneği:
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("key", 10); if let Some(value) = map.get_mut("key") { *value += 1; } println!("{:?}", map.get("key")); }
Anahtar özellikler:
Farklı referanslar üzerinden HashMap'in birkaç elemanına aynı anda erişim mümkün müdür?
Hayır, Rust bunu standart API vasıtasıyla izin vermez: değiştirme işlemi, sadece HashMap'in tamamı için tekil bir referansla mümkündür.
Aynı eleman için değiştirilebilir ve değiştirilemez bir referans elde etmeye çalışıldığında ne olur?
Derleyici, borrow checker kurallarının ihlali nedeniyle bir hata verecektir: bir değerin değiştirilebilir ve değiştirilemez referanslarını birleştirmek mümkün değildir.
entry() API'si yalnızca yeni elemanlar eklemek için mi çalışır?
Hayır, Entry API'si kullanılarak mevcut bir değeri değiştirmek için de erişim sağlanabilir, yalnızca ekleme için değil.
map.entry("key").and_modify(|v| *v += 1).or_insert(0);
HashMap'teki değerlerin referanslarını, haritanın yaşam süresi garantisi olmadan küresel değişkenlere vermek.
Artılar:
Eksiler:
HashMap'i Arc<Mutex<_>> içine sarmak, birkaç iş parçacığından kullanım için.
Artılar:
Eksiler: