代码之家  ›  专栏  ›  技术社区  ›  Felix

Rust:扩展到宏调用的过程宏的卫生

  •  1
  • Felix  · 技术社区  · 7 年前

    我想写一个函数,比如程序宏 my_macro 这扩展到了 lazy_static 宏调用。我想用一种 我的_宏 不需要列出 懒惰的静态 并明确使用它( use lazy_static::lazy_static ).

    以下是最简单的示例代码:

    lib。rs(我的箱子)

    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()
    }
    

    货物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);
        }
    }
    

    货物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!();
      | ^^^^^^^^^^^^
    

    我理解这个错误,我知道我可以通过让 usage 板条箱依赖于 懒惰的静态 use 它在 lib.rs (参见注释行)。

    问题是,这意味着所有使用 我的_宏 必须列出 懒惰的静态 在他们的依赖中。这似乎不对,我想知道是否有其他选择。我已经尝试了一些方法,但都没有解决问题。

    0 回复  |  直到 6 年前