我想要一个命令,这样do_something --list 1 2 3会导致结构中的字段设置为[1, 2, 3].
以下代码适用于do_something --list 1 --list 2 --list 3:
use clap::Parser; // 3.2.8
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
pub struct Cli {
#[clap(short, long, value_parser)]
pub list: Option<Vec<i32>>,
}
fn main() {
let cli = Cli::parse();
println!("CLI is {:#?}", cli);
}
Run Code Online (Sandbox Code Playgroud)
当我使用时--list 1 2 3,它给了我错误:
错误:发现参数“2”不是预期的,或者在此上下文中无效
我也尝试过--list "1 2 3",--list 1,2,3但也遇到了错误。
我还能够获得多个值作为位置参数,但不能作为Option带有标志的参数。
--list 1 2 3拍手是支持什么吗?我认为这是由 clap 的多个值支持的。我的设置/代码或命令行输入中是否缺少某些内容?
Pit*_*taJ 12
您正在寻找use_value_delimiter设置。设置use_value_delimiter = true并设置要与 一起使用的实际分隔符value_delimiter = ','。
在 clap 4.2.7 中,use_value_delimiter已弃用,这意味着接受的答案不再有效,相反,您应该使用num_args = 1..
use clap::Parser; // 4.2.7
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
pub struct Cli {
#[clap(short, long, value_delimiter = ' ', num_args = 1..)]
pub list: Option<Vec<i32>>,
}
fn main() {
let cli = Cli::parse();
println!("CLI is {:#?}", cli);
}
Run Code Online (Sandbox Code Playgroud)
$ cargo b
$ ./target/debug/rust --list 1 2 3
CLI is Cli {
list: Some(
[
1,
2,
3,
],
),
}
Run Code Online (Sandbox Code Playgroud)