我想添加一个命令行标志。这是一个标志,所以它不需要参数,它要么存在要么不存在。我还需要知道如何读取标志,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()
这个答案已经过时了。你想要的是:
.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")