#variables #scope #hash-set #hash-map #scoping

quickscope

多层级 HashMap 和 HashSet 实现,以高效表示变量作用域

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

Download history 47/week @ 2024-03-12 46/week @ 2024-03-19 65/week @ 2024-03-26 95/week @ 2024-04-02 71/week @ 2024-04-09 83/week @ 2024-04-16 58/week @ 2024-04-23 67/week @ 2024-04-30 61/week @ 2024-05-07 59/week @ 2024-05-14 66/week @ 2024-05-21 67/week @ 2024-05-28 56/week @ 2024-06-04 52/week @ 2024-06-11 62/week @ 2024-06-18 46/week @ 2024-06-25

每月下载量 231
8 个crate中使用(直接使用3个)

MIT授权

44KB
1K SLoC

quickscope

Crates.io Docs.rs

多层级 HashMapHashSet 实现,用于高效表示变量作用域。

安装

请使用 cargo-edit 以添加此库的最新版本

cargo add quickscope

用途

该crate包含两个数据结构,ScopeMapScopeSet,用于表示变量作用域,在 ScopeMap 的情况下,还表示关联的变量值。访问操作使得更高(即更具体)的作用域中的变量覆盖了更低(即更一般)的作用域中的变量。

理由(即“为什么还需要另一个这样的”)

我知道我不是第一个做这件事的人!还有其他同样可用的crate来实现相同的目的(见:hash-chainchainmapchain-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功能?

ScopeMapScopeSet 优化了表示变量作用域。因此,它们缺少更多通用HashMap/HashSet实现中找到的许多典型方法。如果您认为应该添加某个功能,请随时提交PR或发布有关此问题的issue。

授权

本库采用MIT授权。有关详细信息,请参阅LICENSE

依赖

~1MB
~18K SLoC