Sorunun tarihi
HashSet ve HashMap koleksiyonları — std::collections'tan standart yapılar olup, hızlı bir şekilde hash ile arama gerçekleştirmektedir. Rust ile dilin ilk versiyonlarından itibaren entegre edilmiştir, ancak bu yapıların iç detayları, sahiplik sistemi nedeniyle deneyimli geliştiricilerde bile sıklıkla zorluklara yol açmaktadır.
Sorun
Ekleme ve çıkarma işlemleri sırasında, (özellikle değerler Copy değilse) kafa karışıklığı oluşmaktadır; ayrıca koleksiyonlar üzerindeki değişiklikler (muamele için borç verme) ve anahtar olarak referansların kullanımı gibi konular sorun yaratmaktadır. Kullanıcı türleri için doğru Eq/Hash uygulaması da bir sorundur.
Çözüm
Kod örneği:
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("key", 42); if let Some(value) = map.get("key") { println!("Bulunan değer: {}", value); } }
Anahtar özellikler:
Aynı HashMap öğesine birden fazla muamele edilebilir referans alınabilir mi?
Hayır, borç verme kontrolörü bunu izin vermez, böylece sahiplik ihlali önlenir.
String literal "abc" doğrudan HashMap<String, V> anahtarı olarak kullanılabilir mi?
Hayır, tam olarak String bekleniyor, "abc" — bu &'static str. Dönüşüm gereklidir: insert("abc".to_string(), val).
HashMap'tan bir değeri çıkarıp ayrı bir değişkende tutarak HashMap'i kullanmaya devam edebilir miyim?
Evet, bir referansı get ile alabilirsiniz — ancak remove (veya move ile alma) işlemi yaparsanız, HashMap değişir ve eski tüm referanslar geçersiz olur.
Anahtarı ve değeri aynı anda ödünç almak ve sonra koleksiyonu değiştirmek:
let mut map = HashMap::new(); map.insert("abc".to_string(), 10); let val = map.get("abc"); map.insert("def".to_string(), 20); // borç kontrol hatası
Artıları:
Eksileri:
Bir değeri çıkarıp, yalnızca kopyası veya klonu ile çalışmak:
let mut map = HashMap::new(); map.insert("abc".to_string(), 10); if let Some(val) = map.get("abc") { let val = *val; // kopyala map.insert("def".to_string(), 20); // her şey çalışıyor }
Artıları:
Eksileri: