为何clap的contains_id()方法始终返回TRUE?如何修复?
问题分析与修复:Clap 3.x中布尔参数的判断错误
问题原因
你代码里的m.contains_id("bar")并非用来检测用户是否传入了--bar选项,它的作用是检查当前命令行配置中是否定义了ID为"bar"的参数。由于你已经在代码里明确定义了这个参数,所以无论用户是否传入--bar,这个判断都会返回true,导致程序每次都输出"Boom!"。
修复方案
Clap 3.x针对布尔类型参数(使用ArgAction::SetTrue定义的),提供了专门的方法来判断用户是否激活了该选项,你可以二选一:
方案1:使用推荐的get_flag方法
替换原有的判断逻辑为m.get_flag("bar"),这是Clap 3.x官方推荐的检测布尔参数是否被激活的方式:
pub fn main() { let m = Command::new("foo") .arg( Arg::new("bar") .long("bar") .required(false) .action(ArgAction::SetTrue) ) .get_matches(); if m.get_flag("bar") { println!("Boom!"); } }
方案2:使用兼容的is_present方法
如果你需要兼容更早的Clap版本,也可以使用is_present方法,效果一致:
pub fn main() { let m = Command::new("foo") .arg( Arg::new("bar") .long("bar") .required(false) .action(ArgAction::SetTrue) ) .get_matches(); if m.is_present("bar") { println!("Boom!"); } }
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

