我在最近的一个项目中写了很多宏.我在想Rust的模块系统在管理"名称空间"方面有多么有用,我开始怀疑:
为什么决定宏不应该也遵循模块系统?这是因为宏使用的普遍罕见吗?还是因为其他一些基本的编译过程限制了它?
有可能"名称空间"Rust 宏吗?
这个问题并不是出于迫切的需要,而是出于一种普遍的好奇心:——
我在最近的一个项目中写了很多宏.我在想Rust的模块系统在管理"名称空间"方面有多么有用,我开始怀疑:
为什么决定宏不应该也遵循模块系统?这是因为宏使用的普遍罕见吗?还是因为其他一些基本的编译过程限制了它?
有可能"名称空间"Rust 宏吗?
这个问题并不是出于迫切的需要,而是出于一种普遍的好奇心:——
宏扩展在"模块系统"之前运行,因此在这一点上并没有真正设置名称解析/搜索.此外,宏实际上可以创建整个模块,因此,让整个分辨率系统工作不一定是possible.这也是宏以声明顺序运行的部分原因(Rust中唯一一个真正重要的地方),因此定义名称和宏的顺序是可预测的.
所以,这里有一些技术问题.不过,如果至少有某种形式的命名空间宏就好了.
在 crate 之间使用名称空间是完全可能的(而且基本上是必要的),也就是说,如果 crate a
和b
都定义了foo!
,那么以下内容应该可以合法化
#![feature(phase)]
#[phase(plugin)] extern crate a;
#[phase(plugin)] extern crate b;
fn main() {
a::foo!();
b::foo!();
}
这还没有实现,但我们希望最终会有这种形式的东西.
有可能"名称空间"Rust 宏吗?
总之:没有,除了通过C名称空间:mylib_mymodule_mymacro!()
.