如何检查命令行参数的第二个元素?

时间:2018-06-30 22:55:16

标签: rust

我需要检查第二个元素,以确定我对其余参数要执行的操作。

这将循环浏览命令行参数,并跳过第一个参数,因为它始终是程序名称。它还跳过了第二个,因为这是我在列表上执行的操作:

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
    }
}

有更好的方法吗?

2 个答案:

答案 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");
        }
    }
}

实际上,您应该使用命令行解析包。