HashMap
Một bảng băm chuẩn với cơ chế bảo vệ chống lại các cuộc tấn công HashDoS:
Speaker Notes
This slide should take about 10 minutes.
-
HashMap
không được định nghĩa trong prelude và cần phải được import vào scope trước khi sử dụng. -
Thử chạy đoạn code sau. Dòng đầu tiên sẽ kiểm tra xem một cuốn sách có tồn tại trong hashmap không, và nếu không trả về một giá trị thay thế. Dòng thứ hai sẽ chèn giá trị thay thế vào hashmap nếu cuốn sách không tồn tại.
let pc1 = page_counts .get("Harry Potter và hòn đá phù thủy") .unwrap_or(&336); let pc2 = page_counts .entry("Trò chơi sinh tử".to_string()) .or_insert(374);
-
Khác với
vec!
, Rust không cung cấp macrohashmap!
.-
Thay vào đó, kể từ phiên bản Rust 1.56, HashMap implement
From<[(K, V); N]>
, cho phép chúng ta dễ dàng khởi tạo một hashmap từ một mảng giá trị:let page_counts = HashMap::from([ ("Harry Potter và hòn đá phù thủy".to_string(), 336), ("Trò chơi sinh tử".to_string(), 374), ]);
-
-
HashMap cũng có thể được khởi tạo từ bất kỳ
Iterator
nào trả về các cặp key-value. -
Trong những ví dụ trên,
HashMap<String, i32>
được sử dụng thay vì&str
để làm cho ví dụ dễ hiểu hơn. Ta tất nhiên có thể sử dụng tham chiếu trong các cấu trúc dữ liệu, nhưng có thể gặp nhiều vấn đề với hệ thống kiểm tra vay mượn của Rust.- Thử xoá hàm
to_string()
từ ví dụ trên và xem chương trình có vẫn chạy không. Bạn nghĩ chúng ta sẽ gặp vấn đề ở đâu?
- Thử xoá hàm
-
HashMap đi kèm với nhiều kiểu dữ liệu chỉ sử dụng làm kiểu trả về của một số hàm, như
std::collections::hash_map::Keys
. Những kiểu dữ liệu này thường xuất hiện trong tài liệu của Rust. Hãy cho học viên xem tài liệu về kiểu dữ liệuKeys
, và liên hệ với hàmkeys
.