HashMap

نقشه hash استاندارد با حفاظت در برابر حملات HashDoS:

use std::collections::HashMap;

fn main() {
    let mut page_counts = HashMap::new();
    page_counts.insert("ماجراهای هاکلبری فین", 207);
    page_counts.insert("قصه‌های گریمز", 751);
    page_counts.insert("غرور و تعصب", 303);

    if !page_counts.contains_key("Les Misérables") {
        println!(
            "ما درباره {} کتاب می دانیم، اما Les Misérables نه.",
            page_counts.len()
        );
    }

    for book in ["غرور و تعصب", "ماجراجویی آلیس در سرزمین عجایب"] {
        match page_counts.get(book) {
            Some(count) => println!("{book}: {count} صفحه‌ها"),
            None => println!("{book} ناشناخته است."),
        }
    }

    // Use the .entry() method to insert a value if nothing is found.
    for book in ["غرور و تعصب", "ماجراجویی آلیس در سرزمین عجایب"] {
        let page_count: &mut i32 = page_counts.entry(book).or_insert(0);
        *page_count += 1;
    }

    println!("{page_counts:#?}");
}
This slide should take about 5 minutes.
  • HashMap در prelude تعریف نشده و باید به scope وارد شود.

  • سطرهای کد زیر را امتحان کنید. سطر اول بررسی می‌کند که آیا یک کتاب در HashMap وجود دارد یا خیر و اگر وجود نداشت، یک مقدار جایگزین برمی‌گرداند. سطر دوم مقدار جایگزین را در HashMap وارد می‌کند اگر کتاب پیدا نشد.

    let pc1 = page_counts
        .get("هری پاتر و سنگ جادو")
        .unwrap_or(&336);
    let pc2 = page_counts
        .entry("The Hunger Games")
        .or_insert(374);
  • برخلاف !vec، متأسفانه ماکروی استاندارد !hashmap وجود ندارد.

    • از نسخه 1.56 Rust به بعد، HashMap پیاده‌سازی‌کننده From<[(K, V); N]> است که به ما اجازه می‌دهد به‌راحتی یک HashMap را از یک آرایه مقداردهی اولیه کنیم:

      let page_counts = HashMap::from([
        ("هری پاتر و سنگ جادو".to_string(), 336),
        ("The Hunger Games".to_string(), 374),
      ]);
  • به‌طور جایگزین، HashMap می‌تواند از هر Iterator که جفت‌های key-value را تولید می‌کند، ساخته شود.

  • ما <HashMap<String, i32 را نمایش می‌دهیم و از استفاده از str& به‌عنوان کلید اجتناب می‌کنیم تا مثال‌ها ساده‌تر شوند. استفاده از ارجاعات در مجموعه‌ها البته ممکن است، اما می‌تواند به مشکلاتی با borrow checker منجر شود.

    • حذف ()to_string از مثال بالا را امتحان کنید و ببینید آیا هنوز کامپایل می‌شود یا خیر. فکر می‌کنید ممکن است با چه مشکلاتی مواجه شویم؟
  • این چندین تایپ "تایپ بازگشتی خاص متد" دارد، مانند std::collections::hash_map::Keys. این تایپ‌ها معمولاً در جستجوهای مستندات Rust ظاهر می‌شوند. مستندات این تایپ را به دانش‌آموزان نشان دهید و پیوند مفید بازگشتی به متد keys را نیز نمایش دهید.