使用 structopt 时,如何测试用户是否提供了一个选项,或者它是否来自默认值?
When using structopt, how to test if the user provided an option or if it comes from the default value?
我正在使用 structopt
箱子并且我有以下结构:
#[derive(Clone, StructOpt, Debug)]
#[structopt(name = "test")]
pub struct CommandlineOptions {
#[structopt(
long = "length",
help = "The length of the the string to generate",
default_value = "50",
index = 1
)]
pub length: usize,
}
let options = CommandlineOptions::from_args();
如果 options.length
是 50
,我怎么知道它来自默认值 50,还是用户提供的值 50?
我认为 structopt
不可能做到这一点。解决此问题的惯用方法是使用 Option<usize>
而不是 usize
(如记录 here):
use structopt::StructOpt;
#[derive(Clone, StructOpt, Debug)]
#[structopt(name = "test")]
pub struct CommandlineOptions {
#[structopt(
long = "length",
help = "The length of the the string to generate",
index = 1
)]
pub length: Option<usize>,
}
fn main() {
let options = CommandlineOptions::from_args();
println!("Length parameter was supplied: {}, length (with respect to default): {}", options.length.is_some(), options.length.unwrap_or(50));
}
如果这在您的情况下不起作用,您也可以直接使用 clap::ArgMatches
结构(structopt
只不过是 clap
周围的宏魔术)来检查length
与 ArgMatches::occurrences_of
的出现次数。但是,这不是很地道。
use structopt::StructOpt;
#[derive(Clone, StructOpt, Debug)]
#[structopt(name = "test")]
pub struct CommandlineOptions {
#[structopt(
long = "length",
help = "The length of the the string to generate",
default_value = "50",
index = 1
)]
pub length: usize,
}
fn main() {
let matches = CommandlineOptions::clap().get_matches();
let options = CommandlineOptions::from_clap(&matches);
let length_was_supplied = match matches.occurrences_of("length") {
0 => false,
1 => true,
other => panic!("Number of occurrences is neither 0 nor 1, but {}. This should never happen.", other)
};
println!("Length parameter was supplied: {}, length (with respect to default): {}", length_was_supplied, options.length);
}
我正在使用 structopt
箱子并且我有以下结构:
#[derive(Clone, StructOpt, Debug)]
#[structopt(name = "test")]
pub struct CommandlineOptions {
#[structopt(
long = "length",
help = "The length of the the string to generate",
default_value = "50",
index = 1
)]
pub length: usize,
}
let options = CommandlineOptions::from_args();
如果 options.length
是 50
,我怎么知道它来自默认值 50,还是用户提供的值 50?
我认为 structopt
不可能做到这一点。解决此问题的惯用方法是使用 Option<usize>
而不是 usize
(如记录 here):
use structopt::StructOpt;
#[derive(Clone, StructOpt, Debug)]
#[structopt(name = "test")]
pub struct CommandlineOptions {
#[structopt(
long = "length",
help = "The length of the the string to generate",
index = 1
)]
pub length: Option<usize>,
}
fn main() {
let options = CommandlineOptions::from_args();
println!("Length parameter was supplied: {}, length (with respect to default): {}", options.length.is_some(), options.length.unwrap_or(50));
}
如果这在您的情况下不起作用,您也可以直接使用 clap::ArgMatches
结构(structopt
只不过是 clap
周围的宏魔术)来检查length
与 ArgMatches::occurrences_of
的出现次数。但是,这不是很地道。
use structopt::StructOpt;
#[derive(Clone, StructOpt, Debug)]
#[structopt(name = "test")]
pub struct CommandlineOptions {
#[structopt(
long = "length",
help = "The length of the the string to generate",
default_value = "50",
index = 1
)]
pub length: usize,
}
fn main() {
let matches = CommandlineOptions::clap().get_matches();
let options = CommandlineOptions::from_clap(&matches);
let length_was_supplied = match matches.occurrences_of("length") {
0 => false,
1 => true,
other => panic!("Number of occurrences is neither 0 nor 1, but {}. This should never happen.", other)
};
println!("Length parameter was supplied: {}, length (with respect to default): {}", length_was_supplied, options.length);
}