8个版本
0.2.0 | 2022年1月28日 |
---|---|
0.1.6 | 2021年1月11日 |
0.1.5 | 2020年10月11日 |
0.1.3 | 2020年9月22日 |
在 数据结构 中排名 1875
每月下载量 231
在 8 个crate中使用(直接使用3个)
44KB
1K SLoC
quickscope
多层级 HashMap
和 HashSet
实现,用于高效表示变量作用域。
安装
请使用 cargo-edit 以添加此库的最新版本
cargo add quickscope
用途
该crate包含两个数据结构,ScopeMap
和 ScopeSet
,用于表示变量作用域,在 ScopeMap
的情况下,还表示关联的变量值。访问操作使得更高(即更具体)的作用域中的变量覆盖了更低(即更一般)的作用域中的变量。
理由(即“为什么还需要另一个这样的”)
我知道我不是第一个做这件事的人!还有其他同样可用的crate来实现相同的目的(见:hash-chain,chainmap,chain-map),但它们的实现使得在层级数量方面的查找最坏情况下为O(n)。我发现这不符合我的需求。
该crate经过优化,使得在层级数量方面的查找平均为O(1)。权衡的是,移除层级的操作与被移除层级的键的数量成O(n)的关系。我认为这在需要在大数量层级中快速查找的场景中是一个可接受的折衷方案。
示例
let mut vars = ScopeMap::new();
// Define two variables in main scope
vars.define("a", 1);
vars.define("b", 2);
// Add a child scope
vars.push_layer();
// Override value of `a`
vars.define("a", 3);
assert_eq!(Some(&3), vars.get("a"));
assert_eq!(Some(&2), vars.get("b"));
// Remove child scope
vars.pop_layer();
// Value of `a` is no longer overridden
assert_eq!(Some(&1), vars.get("a"));
为什么常规HashMap/HashSet缺少X功能?
ScopeMap
和 ScopeSet
优化了表示变量作用域。因此,它们缺少更多通用HashMap/HashSet实现中找到的许多典型方法。如果您认为应该添加某个功能,请随时提交PR或发布有关此问题的issue。
授权
本库采用MIT授权。有关详细信息,请参阅LICENSE。
依赖
~1MB
~18K SLoC