我有一个包含 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/