在不修改 args 的情况下采用第一个参数的简洁方法
Clean way of taking first argument without modifiying args
这个程序应该像这样接受参数:<command> n1 n2 n3...
例如 mode 1 2 3 3 4
。我想存储 <command>
参数字符串并将其余参数传递给构造函数进行解析。
fn main() {
let args = args();
let command = args.skip(1).next().unwrap_or_else(|| {
eprintln!("Command not found; expected one of \"mode\", \"mean\", \"median\" \"range\"");
process::exit(1);
});
let set = DataSet::from_args(args).unwrap_or_else(|err| {
eprintln!("error parsing values: {}", err);
process::exit(1);
});
match command.to_lowercase().trim() {
"mode" => println!("{:?}", set.mode()),
_ => eprintln!("Command not recognised: \"{}\"", command),
}
}
此代码不起作用,因为 args.skip(1).next()...
通过将其改编为 Skip
来消耗 args
,因此当我尝试调用 DataSet::from_args(args)
时它无效,因为它已搬入 skip
.
实现此目标的最佳方法是什么?我听说 itertools 库可以为 Args
提供 nth
方法,但我更愿意在没有的情况下这样做。
首先,std has nth()
method:您可以使用nth(1)
代替skip(1).next()
。
其次,Iterator
is implemented for &mut Iterator
. So you can just call skip()
on &mut args
. There is even a method for that: by_ref()
:
let command = args.by_ref().skip(1).next().unwrap_or_else(|| {
eprintln!("Command not found; expected one of \"mode\", \"mean\", \"median\" \"range\"");
process::exit(1);
});
这个程序应该像这样接受参数:<command> n1 n2 n3...
例如 mode 1 2 3 3 4
。我想存储 <command>
参数字符串并将其余参数传递给构造函数进行解析。
fn main() {
let args = args();
let command = args.skip(1).next().unwrap_or_else(|| {
eprintln!("Command not found; expected one of \"mode\", \"mean\", \"median\" \"range\"");
process::exit(1);
});
let set = DataSet::from_args(args).unwrap_or_else(|err| {
eprintln!("error parsing values: {}", err);
process::exit(1);
});
match command.to_lowercase().trim() {
"mode" => println!("{:?}", set.mode()),
_ => eprintln!("Command not recognised: \"{}\"", command),
}
}
此代码不起作用,因为 args.skip(1).next()...
通过将其改编为 Skip
来消耗 args
,因此当我尝试调用 DataSet::from_args(args)
时它无效,因为它已搬入 skip
.
实现此目标的最佳方法是什么?我听说 itertools 库可以为 Args
提供 nth
方法,但我更愿意在没有的情况下这样做。
首先,std has nth()
method:您可以使用nth(1)
代替skip(1).next()
。
其次,Iterator
is implemented for &mut Iterator
. So you can just call skip()
on &mut args
. There is even a method for that: by_ref()
:
let command = args.by_ref().skip(1).next().unwrap_or_else(|| {
eprintln!("Command not found; expected one of \"mode\", \"mean\", \"median\" \"range\"");
process::exit(1);
});