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

wdebmtf2  于 2022-11-24  发布在  其他
关注(0)|答案(4)|浏览(188)

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

.arg(
    Arg::with_name("metal")
        .long("metal-micky")
        .required(false)
        .help("I want metal micky"),
)

我尝试读取的值如下:

let z = matches.value_of("metal");

但是,当我打印它时,结果是None

println!("FLAG: {:?}", z);

即使我在命令行上指定了标志,它也是None

mrfwxfqh

mrfwxfqh1#

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

.arg(
    Arg::with_name("metal")
        .long("metal-micky")
        .required(false)
        .takes_value(false)
        .help("I want metal micky"),
)

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

s4chpxco

s4chpxco2#

当前接受的答案有点过时,指定takes_value(false)时不再需要指定required(false)。因此,您需要的是:

.arg(
    Arg::with_name("metal")
        .long("metal-micky")
        .takes_value(false)
        .help("I want metal mickey")

并使用matches.is_present("metal")检查是否存在。

7hiiyaii

7hiiyaii3#

这可以通过action属性来完成。如果您的字段是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)
}

文件

raogr8fs

raogr8fs4#

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

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

检查标志是否通过contains_id()传递

相关问题