在下面的代码片段中,我没有导入宏 clap 和 arg,但它们仍然可用于代码。他们从哪里来?
use clap::Parser;
#[derive(Parser, Debug)]
struct Arguments {
#[clap(short, long)]
first_part: Option<String>,
#[arg(short, long)]
second_part: Option<String>,
}
fn main() {
let args = Arguments::parse();
println!("{:?}", args);
}
最佳答案
这些不是宏,而是attributes .
造成困惑的原因是 derive
也是一个属性,而不是宏。只是一些派生实现是作为宏实现的。请记住,普通宏由 !
识别,而不是由 #
识别,例如 println!
。
这些属性从何而来?好吧,属性永远不会导入,这些 derive macro helper attributes直接由任何可能有效的宏进行解析。是的,这意味着这些属性不受范围限制,理论上可能会在多个 crate 之间发生冲突。据我所知,这还没有发生。
关于rust - 如果不导入 clap 宏,它们从哪里来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75040742/