StructOpt: как объединить все аргументы в одну строку? - PullRequest
2 голосов
/ 17 марта 2020

Что я хочу сделать, так это получить доступ к предоставленным пользователем аргументам командной строки в виде одной строки. Сначала я сделал это как:

let lst: Vec<String> = std::env::args().collect();
let res: String = lst[1..].join(" ");

Но затем я решил попробовать сделать это с structopt и застрял. Можно ли достичь желаемого результата с помощью structopt и как мне это сделать?

1 Ответ

2 голосов
/ 17 марта 2020

Вот простой пример:

extern crate structopt; // 0.3.11

use structopt::StructOpt;

#[derive(StructOpt, Debug)]
#[structopt(name = "arguments")]
struct Arguments {
    #[structopt(name = "ARGUMENTS")]
    rest: Vec<String>
}

impl Arguments {
    fn get_joined(&self, separator: &str) -> String {
        self.rest.join(separator)
    }
}

fn main() {
    let arguments = Arguments::from_args();

    println!("{}", arguments.get_joined(" "));
}

Если вам просто нужно объединить аргументы в строку, ваш подход уже хорош. Я полагаю, вы хотите использовать structopt, потому что вы хотите прочитать другие аргументы командной строки. В этом случае просто расширите struct для поддержки пар key=value. Например:

extern crate structopt; // 0.3.11

use structopt::StructOpt;

#[derive(StructOpt, Debug)]
#[structopt(name = "arguments")]
struct Arguments {
    #[structopt(short, long)]
    debug: bool,

    #[structopt(short = "v", long = "velocity", default_value = "42")]
    speed: f64,

    #[structopt(name = "ARGUMENTS")]
    rest: Vec<String>
}

impl Arguments {
    fn get_joined(&self, separator: &str) -> String {
        self.rest.join(separator)
    }
}

fn main() {
    let arguments = Arguments::from_args();

    println!("{}", arguments.get_joined(" "));

    println!("{:?}", arguments);
}

Вызов должен выглядеть следующим образом: ./target/release/try-structopt --debug -v 9.81 who am i

И вывод:

who am i

Arguments { debug: true, speed: 9.81, rest: ["who", "am", "i"] }

...