未显式导入clap和arg宏却能使用,它们来自哪里?
关于clap和arg宏的来源说明
1. #[clap]宏的来源
你通过use clap::Parser;导入的Parser trait属于clap库的根模块(clap模块),而clap宏是该模块下导出的过程宏。按照Rust的导入规则,当你导入模块内的项时,该模块中可见的宏会被自动带入当前作用域,因此无需单独写use clap::clap;就能直接使用#[clap(...)]注解。
2. #[arg]宏的来源
arg宏是由#[derive(Parser)]派生宏自动注入的。当你为结构体派生Parser trait时,clap的派生逻辑会自动将arg宏引入到该结构体的字段注解作用域中,所以你无需显式导入就能在字段上使用#[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); }
内容的提问来源于stack exchange,提问作者Danilo Souza Morães
相关产品推荐
相关产品推荐

