2 个不稳定版本

0.2.0 2021年6月18日
0.1.0 2020年7月9日

#1368开发工具


用于 2 个 crate(通过 kontroli

MIT/Apache

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());

无运行时依赖