如何使用 Clap 指定布尔命令行标志?

Pet*_*pho 10 rust clap

我想添加一个命令行标志。这是一个标志,所以它不需要参数,它要么存在要么不存在。我还需要知道如何读取标志,TRUE 或 FALSE。

这是定义标志的代码:

.arg(
    Arg::with_name("metal")
        .long("metal-micky")
        .required(false)
        .help("I want metal micky"),
)
Run Code Online (Sandbox Code Playgroud)

我正在尝试读取这样的值:

let z = matches.value_of("metal");
Run Code Online (Sandbox Code Playgroud)

但是,None当我打印它时会导致:

println!("FLAG: {:?}", z);
Run Code Online (Sandbox Code Playgroud)

None甚至当我在命令行上指定标志时也是如此。

kem*_*ica 26

这可以通过属性来完成action。如果您的字段是 a bool,则默认情况下选择的操作是ArgAction::SetTrue

这非常好,因为调用参数时不需要设置值。运行程序时,如果使用,则默认将该值设置为 true,如果不使用,则默认设置为 false。

use clap::Parser;

/// This is a simple program
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
   /// It just works!
   #[clap(long, short, action)]
   it_just_works: bool,
}

fn main() {
   let args = Args::parse();

    println!("It just works {}!", args.it_just_works)
}
Run Code Online (Sandbox Code Playgroud)

要更改默认行为,您可以执行以下操作:

#[clap(long, short, action=ArgAction::SetFalse)]
Run Code Online (Sandbox Code Playgroud)

文档


yor*_*odm 15

不知道这是否是“批准”的方法,但我使用Args::takes_value

.arg(
    Arg::with_name("metal")
        .long("metal-micky")
        .required(false)
        .takes_value(false)
        .help("I want metal micky"),
)
Run Code Online (Sandbox Code Playgroud)

然后检查标志是否通过 matches.is_present("metal")


小智 13

基于构建器的答案都已过时。在3.0中with_name()已被替换为,在4.0中已被替换为。在3.2中也已被替换。新版本将是:new()takes_value()num_args()is_present()contains_id()

.arg(
     Arg::new("metal")
        .long("metal-micky")
        .required(false)
        .num_args(0)
        .help("I want metal micky"),
)
Run Code Online (Sandbox Code Playgroud)

检查该标志是否已通过contains_id()


Dig*_*dra 6

这个答案已经过时了。你想要的是:

.arg(
    Arg::with_name("metal")
        .long("metal-micky")
        .takes_value(false)
        .help("I want metal mickey")
Run Code Online (Sandbox Code Playgroud)

然后你检查: matches.is_present("metal")