0

我正在使用 structopt 来定义可以使用的参数

mfe -s opt1 -s opt2 -s opt2 this_is_an_argument

或者

mfe -s opt1 opt2 opt3 this_is_an_argument

问题是该this_is_an_argument参数被解析为一个选项。我知道我可以--在争论之前使用,但是有更好的解决方案吗?

use std::path::PathBuf;
use structopt::StructOpt;

#[derive(StructOpt, Debug)]
struct CLIArgs {
    #[structopt(short = "s", long = "str")]
    strings: Vec<String>,

    #[structopt(name = "PATH", parse(from_os_str))]
    path: Option<PathBuf>,
}

fn main() {
    let args = CLIArgs::from_args();
    println!("{:?}", args);
}
$ mfe -s foo bar baz /this/is/a/path
CLIArgs { strings: ["foo", "bar", "baz", "/this/is/a/path"], path: None }

我想/this/is/a/path被解析为path,而不是被迫使用--. 也许用参数的顺序做些什么?

4

1 回答 1

1

所以我找到了以下解决方案:

use std::path::PathBuf;
use structopt::StructOpt;

#[derive(StructOpt, Debug)]
struct CLIArgs {
    #[structopt(short = "s", long = "str", raw(number_of_values = "1"))]
    strings: Vec<String>,

    #[structopt(name = "PATH", parse(from_os_str))]
    path: Option<PathBuf>,
}

fn main() {
    let args = CLIArgs::from_args();
    println!("{:?}", args);
}

请注意,它强制用户以这种方式使用程序:

$ mfe -s foo -s bar -s baz /this/is/a/path

这不方便,具体取决于您的用例。

于 2019-02-16T09:57:55.837 回答