rust - 如果不导入 clap 宏,它们从哪里来?

标签 rust clap

在下面的代码片段中,我没有导入宏 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/

相关文章:

generics - 在特征对象中使用泛型类型参数的引用问题是什么?

rust - `paint_evm::Event` 未针对 `Event` 实现

rust - 动态生成参数Clap

rust clap 解析 ipv4Addr

rust - 如何将映射函数中的变量绑定(bind)到类型?

rust - 为什么特征 `core::fmt::Show` 没有为类型 `core::fmt::Show + Sized` 实现?

rust - 特质 `std::convert::From<cli::Opts>`未实现

rust - 使用多于一个的短值字母

rust - 在 Clap 的一个参数中取多个值

rust - clap - 返回 ArgMatches<'static> 时如何传递 default_value