Rust:程序宏的卫生,扩展为宏调用

时间:2019-02-08 13:29:43

标签: macros rust

我在程序宏卫生方面遇到问题。我的实际任务比较复杂,但是核心问题是:

我正在尝试编写一个类似于函数的过程宏my_macro,该宏扩展为lazy_static宏调用。我想这样写:my_macro的用户不需要在其板条箱的依存关系中列出lazy_static并显式使用它(use lazy_static::lazy_static)。

这是最小的示例代码:

lib.rs(my_macro板条箱)

extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;

#[proc_macro]
pub fn my_macro(_item: TokenStream) -> TokenStream {
    quote!(
        lazy_static! {
            static ref EXAMPLE: u8 = 42;
        }
    ).into()
}

cargo.toml(我的宏板条箱)

[package]
name = "my_macro"
version = "0.1.0"
edition = "2018"

[dependencies]
quote = "0.6"
lazy_static = "1.2.0"

[lib]
proc-macro = true

lib.rs(使用箱)

use my_macro::my_macro;
// use lazy_static::lazy_static;

my_macro!();

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn it_works() {
        assert_eq!(*EXAMPLE, 42);
    }
}

Cargo.toml(使用箱)

[package]
name = "import_test"
version = "0.1.0"
edition = "2018"

[dependencies]
my_macro = { path = "./my_macro" }
# lazy_static = "1.2.0"

上面的代码会导致编译错误:

error: cannot find macro `lazy_static!` in this scope
 --> src/lib.rs:6:1
  |
6 | my_macro!();
  | ^^^^^^^^^^^^

error: aborting due to previous error

我理解该错误,并且知道可以通过使usage板条箱依赖于lazy_staticuselib.rs中的错误来解决它(请参见注释行)。

问题在于,这意味着所有使用my_macro的箱子都必须在其依赖项中列出lazy_static。这似乎不正确,我想知道是否还有其他选择。我已经尝试了几件事,但是没有解决问题的方法。

谢谢!

0 个答案:

没有答案