HashMap

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

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

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 را نیز نمایش دهید.