在最近的项目中,我一直在编写很多宏。我只是在考虑Rust的模块系统对管理“命名空间”有多么有用,我开始怀疑:
这个问题不是由迫切的需求引起的,而更多是由好奇心引起的:-)
最佳答案
宏扩展在“模块系统”之前运行,因此此时尚未真正进行名称解析/搜索。而且,宏实际上可以创建整个模块,因此不一定要使整个解析系统都能正常工作。这也是按声明顺序运行宏的部分原因(这是Rust中真正重要的唯一位置),因此可以预定义名称和宏的顺序。
因此,存在一些技术问题。但是,至少拥有某种形式的命名空间宏确实很棒。
在 crate 之间绝对有可能(并且本质上是必要的)进行命名空间调整,也就是说,如果 crate a
和b
都定义了foo!
,则应使以下内容合法
#![feature(phase)]
#[phase(plugin)] extern crate a;
#[phase(plugin)] extern crate b;
fn main() {
a::foo!();
b::foo!();
}
目前尚未实现,但希望最终会有这种形式的东西。
总结:否,除了通过C-namespacing:
mylib_mymodule_mymacro!()
。关于macros - 是否可以 "namespace"Rust宏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24794821/