macros - 在 Rust 中使用 'private' 时,如何将一些宏定义为模块的 `macro_use`?

标签 macros namespaces rust

我有一个包含 Rust 项目共享宏的文件。

因为我想在 crate 中(模块之间)重复使用宏,所以我使用 #[macro_use] 声明模块。

在写宏的时候,我把一些共享的逻辑拆分成一个宏来避免重复,在这种情况下我不能使用私有(private)函数,它需要是一个宏。 如果可能的话,我想隐藏这个共享宏,这样它就不能被其他模块直接使用。

有没有办法让一些宏私有(private),这样它们就不会通过#[macro_use]暴露给同一个 crate 中的其他模块?

最佳答案

Rust 中实际上有一个习惯用法,用于隐藏“实现细节”宏。

与其声明一个单独的宏,不如在现有宏中声明一个单独的case。我见过的示例将为此使用 impl 关键字,而 impl 案例位于宏定义的底部。

因此,代替:

macro_rules! hello_impl {
    ($name:expr) => {
        println!("Hello {}!", $name);
    }
}

macro_rules! hello_world {
    () => {
        hello_impl!("world");
    }
}

您使用:

macro_rules! hello_world {
    () => {
        hello_world!(impl "world");
    },
    (impl $name:expr) => {
        println!("Hello {}!", $name);
    }
}

这样就没有实现宏了;而且您只有一个要导出的宏。

关于macros - 在 Rust 中使用 'private' 时,如何将一些宏定义为模块的 `macro_use`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40481199/

相关文章:

c - 如何检测类型是 C 预处理器中的指针?

c++ - 重载C预处理程序宏-基于调用语法的区分

python - 有什么方法可以像Python中的C++宏函数那样替换数字吗?

.net - 为什么在 .NET 框架中有一些命名空间有几个与之关联的 DLL?

visual-studio-code - 如何解决带有Rust VS Code扩展名的 "Couldn' t启动客户端Rust语言服务器”?

c - 用于为 AVX shuffle 内在函数生成立即数的宏

clojure - 是否可以在命名空间上下文中加载文件?

ruby-on-rails - 在 Rails 中更改命名空间

http - 你如何在 Rust 中发出 GET 请求?

math - 编译器是否优化数学表达式?