Как проверить второй элемент аргументов командной строки? - PullRequest
0 голосов
/ 01 июля 2018

Мне нужно проверить второй элемент, чтобы определить, какое действие я делаю с остальными аргументами.

Это перебирает аргументы командной строки и пропускает первый, потому что это всегда имя программы. Он также пропускает второй, потому что это операция, которую я выполняю в списке:

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 голосов
/ 21 января 2019

Если вам нужно проверить аргумент для флага, который может присутствовать или не присутствовать, вы можете использовать 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");
        }
    }
}

Реально, вы должны использовать пакет синтаксического анализа командной строки.

0 голосов
/ 01 июля 2018

Вы можете использовать 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...