HashMap

HashDoS saldırılarına karşı korumalı standart özet haritası (hash map):

use std::collections::HashMap;

fn main() {
    let mut page_counts = HashMap::new();
    page_counts.insert("Fadiş", 207);
    page_counts.insert("Dede Korkut Hikayeleri", 751);
    page_counts.insert("Aşk-ı Memnu", 303);

    if !page_counts.contains_key("İnce Mehmed") {
        println!(
            "{} kitap hakkında bilgimiz var, ama İnce Mehmed hakkında yok.",
            page_counts.len()
        );
    }

    for book in ["Aşk-ı Memnu", "Keloğlan Masalları "] {
        match page_counts.get(book) {
            Some(count) => println!("{book}: {count} sayfa"),
            None => println!("{book} bilinmiyor."),
        }
    }

    // Eğer bir şey bulunmazsa bir değer eklemek için .entry() metodunu kullanın.
    for book in ["Aşk-ı Memnu", "Keloğlan Masalları "] {
        let page_count: &mut i32 = page_counts.entry(book).or_insert(0);
        *page_count += 1;
    }

    dbg!(page_counts);
}
This slide should take about 5 minutes.
  • HashMap, başlangıç (prelude) kısmında tanımlı değildir ve kapsama (scope) alınması gerekir.

  • Aşağıdaki kod satırlarını deneyin. İlk satır bir kitabın hash haritasında olup olmadığına bakar ve yoksa alternatif bir değer geri döndürür. İkinci satır, kitap bulunmazsa alternatif değeri hash haritasına ekler.

    let pc1 = page_counts
        .get("Osmanlı Cadısı")
        .unwrap_or(&336);
    let pc2 = page_counts
        .entry("Gri Gökyüzü ")
        .or_insert(374);
  • vec!’in aksine, maalesef standart bir hashmap! makrosu yoktur.

    • Ancak, Rust 1.56’dan beri, HashMap From<[(K, V); N]> özelliğini (trait) gerçekleştirir (implement), bu da bir özet haritasını (hash map) bir değişmez (literal) diziden kolayca ilklendirmemize (initialize) olanak tanır:

      let page_counts = HashMap::from([
        ("Osmanlı Cadısı".to_string(), 336),
        ("Gri Gökyüzü ".to_string(), 374),
      ]);
  • Alternatif olarak HashMap, anahtar-değer (key-value) demetleri (tuple) üreten herhangi bir Iterator’dan oluşturulabilir.

  • Bu tür, std::collections::hash_map::Keys gibi birkaç “metoda özgü” geri dönüş türüne sahiptir. Bu türler genellikle Rust belgelerindeki aramalarda görünür. Öğrencilere bu türün belgelerini ve keys metoduna geri dönen yardımcı bağlantıyı gösterin.