rust - 如何编写扩展为宏调用的过程宏,而不需要用户导入宏的 crate?
问题描述
我正在尝试编写一个类似函数的过程宏my_macro
,该宏可以扩展为lazy_static
宏调用。my_macro
我想以一种用户不需要lazy_static
在其 crate 的依赖项中列出并明确使用它的方式编写它( use lazy_static::lazy_static
)。
这是最小的示例代码:
lib.rs (my_macro crate)
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 (my_macro crate)
[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!();
| ^^^^^^^^^^^^
我理解这个错误,我知道我可以通过让usage
crate 依赖它lazy_static
来解决它(见注释行)。use
lib.rs
问题是这意味着所有使用的 cratemy_macro
都必须lazy_static
在它们的依赖项中列出。这似乎不对,我想知道是否有替代方案。我已经尝试了几件事,但没有解决问题。
解决方案
推荐阅读
- python - cifar10 数据的 gabor 过滤器实现
- linux - 在添加到 PATH 时动态声明一个环境变量
- azure - Azure CDN - 从 *.azurewebsites.net 重定向到 cdn 生成 ERR_TOO_MANY_REDIRECTS 错误
- php - 合并远程存储的 PDF Laravel
- laravel - 如何在刀片 laravel 8 中获取选择输入的旧值?
- javascript - 使用 i18n 从 svelte store 中导出一个简单的数据对象
- reactjs - 如何改进过滤器 ReactJS
- python - 在 python 中,将函数用作类的属性的正确语法是什么?
- amazon-web-services - 具有动态环境变量的 Elastic Beanstalk app.config option_settings 不起作用
- python - 从 pandas Dataframe 列创建列表的高效/Pythonic 方式