我在最近的一个项目中写了很多宏.我在想Rust的模块系统在管理"名称空间"方面有多么有用,我开始怀疑:

  1. 为什么决定宏不应该也遵循模块系统?这是因为宏使用的普遍罕见吗?还是因为其他一些基本的编译过程限制了它?

  2. 有可能"名称空间"Rust 宏吗?

这个问题并不是出于迫切的需要,而是出于一种普遍的好奇心:——

推荐答案

宏扩展在"模块系统"之前运行,因此在这一点上并没有真正设置名称解析/搜索.此外,宏实际上可以创建整个模块,因此,让整个分辨率系统工作不一定是possible.这也是宏以声明顺序运行的部分原因(Rust中唯一一个真正重要的地方),因此定义名称和宏的顺序是可预测的.

所以,这里有一些技术问题.不过,如果至少有某种形式的命名空间宏就好了.

在 crate 之间使用名称空间是完全可能的(而且基本上是必要的),也就是说,如果 crate ab都定义了foo!,那么以下内容应该可以合法化

#![feature(phase)]

#[phase(plugin)] extern crate a;
#[phase(plugin)] extern crate b;

fn main() {
    a::foo!();
    b::foo!();
}

这还没有实现,但我们希望最终会有这种形式的东西.

有可能"名称空间"Rust 宏吗?

总之:没有,除了通过C名称空间:mylib_mymodule_mymacro!().

Rust相关问答推荐

通用池类型xsx

trait声明中的生命周期参数

如何使用Match比较 struct 中的值

如何处理动态 struct 实例化?

如何为utoipa中的可选查询参数生成OpenAPI模式?

在自定义序列化程序中复制serde(With)的行为

用 rust 蚀中的future 展望 struct 的future

为什么我需要 to_string 函数的参考?

tokio::sync::broadcast::Receiver 不是克隆

仅发布工作区的二进制 crate

相当于 Rust 中 C++ 的 std::istringstream

中文优化标题:跳出特定循环并返回一个值

为什么这段 Rust 代码会在没有递归或循环的情况下导致堆栈溢出?

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

使用 lalrpop 在 rust 中解析由 " 引用的字符串

有没有办法通过命令获取 Rust crate 的可安装版本列表?

我如何将 google_gmail1::Gmail> 传递给线程生成?

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

Rust:为什么在 struct 中borrow 引用会borrow 整个 struct?