我需要检查第二个元素,以确定我对其余参数要执行的操作。
这将循环浏览命令行参数,并跳过第一个参数,因为它始终是程序名称。它还跳过了第二个,因为这是我在列表上执行的操作:
for arg in std::env::args().skip(2)
我正在做以下多余的事情:
let check: Vec<String> = env::args().collect();
if check[1] == 'sort'{
for arg in std::env::args().skip(2){
//sort
}
}
有更好的方法吗?
答案 0 :(得分:1)
您可以使用nth()
:
let second_arg = env::args().nth(1).expect("no second arg");
返回一个Option<String>
。
从语义上讲,先叫skip(1)
,然后叫next()
。
要走得更远,您可以使用模式匹配:
let mut args = env::args();
match args.nth(1).as_ref().map(|s| s.as_str()) {
// args has been consumed so it will iterate over the next elements
Some("sort") => for arg in args {
println!("arg: {}", arg);
},
_ => {},
}
有必要将参数从String
转换为&str
,以便能够按原样使用Some("sort")
。
或者,您可能希望使用命令行解析包,例如clap。
答案 1 :(得分:0)
如果您需要检查参数中是否存在可能存在的标志,则可以使用peekable
:
use std::env;
fn main() {
let mut args = env::args()
.skip(1) // skip program name
.peekable(); // allow looking forward one
match args.peek().map(|x| x.as_ref()) {
Some("--option1") => {
args.next(); // Skip the flag
println!("handle option 1");
}
Some("--option2") => {
args.next(); // Skip the flag
println!("handle option 2");
}
_ => {
println!("handle no option");
}
}
}
实际上,您应该使用命令行解析包。