问题
常见bool类型参数实现
常见的rustclap 示例代码,给出了针对bool类型参数的实现 比如一个bool类型的index参数,缺省值是false, 当你不带参数表示false,带上参数是true
- 代码示例
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Argument {
#[arg(short, long, default_value_t = false)]
pub index: bool,
}
- 脚本执行
# 得到index= true
cargo run -- --index
# 得到index = false ,不懈怠--index 参数 (因为default_value_t 的原因)
cargo run
缺省bool参数实现的困境
- 缺省代码:
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Argument {
#[arg(short, long, default_value_t = true)]
pub index: bool,
}
- 分析问题: 如果设置bool的参数缺省值是true,在命令中难以设置false 因为clap缺省对bool参数采用action=clap::ArgAction::SetTrue.
解决方案:
- 1 如果想设置false,需要指定action=clap::ArgAction::Set,
- 2 同时为了将字符串“true”或“false”转换成 bool值,需要设置value_parser
代码:
use clap::Parser;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Argument {
#[arg(short, long, default_value_t = true,action=clap::ArgAction::Set, value_parser= clap::value_parser!(bool))]
pub index: bool,
}
fn main() {
let arg = Argument::parse();
println!("args {:?}", &arg);
}
调用的例子
ljl@ljl-lenovo:clap_demo$ cargo run --quiet -- -i false
args Argument { index: false }
ljl@ljl-lenovo:clap_demo$ cargo run --quiet -- -i true
args Argument { index: true }