#map #lazy-evaluation #once

无 std once_map

单赋值和懒映射

21 个版本

0.4.18 2024 年 5 月 15 日
0.4.15 2024 年 2 月 13 日
0.4.13 2023 年 11 月 23 日
0.4.6 2023 年 6 月 6 日
0.3.1 2022 年 7 月 10 日

#25缓存

Download history 512/week @ 2024-05-04 443/week @ 2024-05-11 563/week @ 2024-05-18 721/week @ 2024-05-25 702/week @ 2024-06-01 861/week @ 2024-06-08 620/week @ 2024-06-15 538/week @ 2024-06-22 501/week @ 2024-06-29 597/week @ 2024-07-06 736/week @ 2024-07-13 4483/week @ 2024-07-20 7860/week @ 2024-07-27 8140/week @ 2024-08-03 7854/week @ 2024-08-10 6839/week @ 2024-08-17

31,888 每月下载量
19 个 Crates 中使用 (4 直接)

MIT/Apache

60KB
2K SLoC

once_map

Crates.io Docs.rs Minimum rustc version

这个 crate 提供 OnceMap,一种可以写入共享引用的 HashMap 类型,但只能写入一次。这与 once_cell 类似,但具有映射功能。这允许在映射的生命周期内引用映射内的值,而不需要进一步加锁。

这使得这种类型非常适合实现缓存。为此提供了 LazyMap 类型。

这个 crate 提供了这种高度优化以用于并发的映射,同时也提供了单线程版本。

示例

let map = OnceMap::new();

// All these are `&str` pointing directly in the map.
// Note that we don't need a mutable reference, so we can have several of
// them at the same time.
let roses = map.insert(String::from("rose"), |_| String::from("red"));
let violets = map.insert(String::from("violets"), |_| String::from("blue"));
let sugar = map.insert(String::from("sugar"), |_| String::from("sweet"));

assert_eq!(roses, "red");
assert_eq!(violets, "blue");
assert_eq!(sugar, "sweet");

// The closure is never run here, because we already have a value for "rose"
let roses = map.insert(String::from("rose"), |_| String::from("green"));
// The old value did not change
assert_eq!(roses, "red");

依赖项

~1.1–6.5MB
~31K SLoC