2 个不稳定版本
0.2.0 | 2021年6月18日 |
---|---|
0.1.0 | 2020年7月9日 |
#1368 在 开发工具
用于 2 个 crate(通过 kontroli)
9KB
120 行
nested-modules
这个 Rust 库为嵌套模块系统提供构建块。
lib.rs
:
嵌套模块。
该软件包允许将(嵌套)模块系统集成到编译器、解释器等项目。其特色在于它解决模块引用的方式:特别是,我们只能通过相对于当前位置的最短路径来引用模块。
例如,假设我们有模块 a/b/c、a/d/e 和 f。此外,让我们假设我们处于模块 a/b/c。然后我们可以通过空路径引用 a/b/c、a/b、a 和根模块(我们当前模块的祖先)。
这种对模块引用的限制使得实现非常简单,并且具有这样的属性:我们总是可以围绕其他模块包装模块,并且可以确信这保留了原始模块的有效引用。
以下示例中,我们创建一个具有根数据 0 的模块以及以下子模块
- b: 1
- a: 2
- b: 3
然后我们从不同的模块中两次搜索模块 "b":当我们处于 "a" 内部时,我们找到两个 "b" 的实例,即 "a"/"b"(3)和 "b"(1)。当我们处于根模块内部时,我们只找到 "b" 的一个实例,即 "b"(1)。
let mut ctx = Context::new();
ctx.get_mut().data = 0;
ctx.insert("b", Module::from(1));
assert!(!ctx.close());
ctx.open_or("a", Module::from(2));
ctx.insert("b", Module::from(3));
// we are now in module "a"
assert_eq!(ctx.get().data, 2);
// searching for a module "b" yields two results
let result: Vec<_> = ctx.find(["b"].iter()).map(|m| m.data).collect();
assert_eq!(result, vec![3, 1]);
// searching for "a" yields no result, because we are inside it
let result: Vec<_> = ctx.find(["a"].iter()).map(|m| m.data).collect();
assert_eq!(result, vec![]);
assert!(ctx.close());
// we are now in the root module
assert_eq!(ctx.get().data, 0);
// searching for either module "b", "a", or "a"/"b" yields only one result now
let result: Vec<_> = ctx.find(["b"].iter()).map(|m| m.data).collect();
assert_eq!(result, vec![1]);
let result: Vec<_> = ctx.find(["a"].iter()).map(|m| m.data).collect();
assert_eq!(result, vec![2]);
let result: Vec<_> = ctx.find(["a", "b"].iter()).map(|m| m.data).collect();
assert_eq!(result, vec![3]);
assert!(!ctx.close());