Rust 我怎样才能避免最后一个论点需要用clap引用?

Rust 我怎样才能避免最后一个论点需要用clap引用?,rust,clap,Rust,Clap,我正在使用clap,在尝试解析参数时,我得到了一个意外的行为 我的命令行工具应该是这样工作的 福佑 e、 g: 福乌杰克回声酒店 傅-u保罗ls-al 我需要获得诸如user之类的选项,但它本身,我需要是args的其余部分 下面的代码会导致一种行为,我无法获取的值,除非它被引用: 福乌杰克回声酒店 错误:找到参数“s”,该参数不是预期的,或者在此上下文中无效 鉴于此方法效果良好: foo-u jack'echo's' 有没有办法避免引用 让matches=App::newfoo .版本0.1 阿

我正在使用clap,在尝试解析参数时,我得到了一个意外的行为

我的命令行工具应该是这样工作的

福佑 e、 g:

福乌杰克回声酒店 傅-u保罗ls-al 我需要获得诸如user之类的选项,但它本身,我需要是args的其余部分

下面的代码会导致一种行为,我无法获取的值,除非它被引用:

福乌杰克回声酒店 错误:找到参数“s”,该参数不是预期的,或者在此上下文中无效 鉴于此方法效果良好:

foo-u jack'echo's' 有没有办法避免引用

让matches=App::newfoo .版本0.1 阿格先生 Arg::使用_nameuser 肖图先生 朗瑟先生 .requiredtrue .这是真的, 阿格先生 Arg::with_name命令 .help要运行的命令 .requiredtrue .这是真的, .找一对火柴;
我还打开了一个.

默认情况下,clap将只解析任何参数一次。这意味着在-u jack echo s中,它将解析-u jack作为用户选项,echo作为命令参数,并且有一个参数s,它不知道该如何处理,因此它不是预期的

要检索所有尾随参数,需要在case命令的最后一个参数上设置,以便它解析所有剩余参数。 另外,在clap命令上设置以下选项,以避免将其余参数解析为clap参数:

:指示clap应在最后一个位置参数之后停止对其他标志/选项的分析。 :允许使用前导连字符(如-al)的参数值。 下面是一个例子:

let matches = App::new("foo")
    .version("0.1")
    .setting(clap::AppSettings::TrailingVarArg)
    .setting(clap::AppSettings::AllowLeadingHyphen)
    .arg(
        Arg::with_name("user")
            .short("u")
            .long("user")
            .required(true)
            .takes_value(true),
    )
    .arg(
        Arg::with_name("command")
            .help("The command to run")
            .required(true)
            .takes_value(true)
            .multiple(true),
    )
    // parse as if program ran as:   foo -u paul ls -al
    .get_matches_from(&["foo", "-u", "paul", "ls", "-al"]);

let command: Vec<&str> = matches.values_of("command").unwrap().collect();
println!("{:?}", command); // ["ls", "-al"]

默认情况下,clap只解析任何参数一次。这意味着在-u jack echo s中,它将解析-u jack作为用户选项,echo作为命令参数,并且有一个参数s,它不知道该如何处理,因此它不是预期的

要检索所有尾随参数,需要在case命令的最后一个参数上设置,以便它解析所有剩余参数。 另外,在clap命令上设置以下选项,以避免将其余参数解析为clap参数:

:指示clap应在最后一个位置参数之后停止对其他标志/选项的分析。 :允许使用前导连字符(如-al)的参数值。 下面是一个例子:

let matches = App::new("foo")
    .version("0.1")
    .setting(clap::AppSettings::TrailingVarArg)
    .setting(clap::AppSettings::AllowLeadingHyphen)
    .arg(
        Arg::with_name("user")
            .short("u")
            .long("user")
            .required(true)
            .takes_value(true),
    )
    .arg(
        Arg::with_name("command")
            .help("The command to run")
            .required(true)
            .takes_value(true)
            .multiple(true),
    )
    // parse as if program ran as:   foo -u paul ls -al
    .get_matches_from(&["foo", "-u", "paul", "ls", "-al"]);

let command: Vec<&str> = matches.values_of("command").unwrap().collect();
println!("{:?}", command); // ["ls", "-al"]

请借此机会在system3语义和Execute2语义之间做出选择,system3语义需要一个带shell命令的参数,如su、ssh,而Execute2语义需要多个单独的参数,如sudo、xargs、find。不要试图接受这两个版本,它只是脆弱和混乱的。@TheotherGuy我会读到的!谢谢你的信息!我知道这些模式,但不知道它们有名称/规格。令人惊叹的请借此机会在system3语义和Execute2语义之间做出选择,system3语义需要一个带shell命令的参数,如su、ssh,而Execute2语义需要多个单独的参数,如sudo、xargs、find。不要试图接受这两个版本,它只是脆弱和混乱的。@TheotherGuy我会读到的!谢谢你的信息!我知道这些模式,但不知道它们有名称/规格。令人惊叹的部分工作,因此如果您尝试使用标志的东西不工作,不幸的是,例如:foo-u jack ls-al由于结尾处的-al而失败。@MarceloBoeira要区分参数和选项,可以使用双破折号-,在这之后,所有参数都不会被解释为选项:foo-u jack-ls-al。它还可以告诉clap在第一个非选项参数之后不要解析选项,但我不确定。我实际上正在考虑删除clap,因为没有它似乎更容易做到,做一些类似foo用户的事情command@MarceloBoeira查看文档,它看起来正是这样做的。它不是那么简单,后面的VarArg允许这样做,但您仍然需要自己进行一些解析…部分工作正常,因此如果您尝试使用标志的操作,不幸的是,例如:foo-u jack ls-al因结尾处的-al而失败。@MarceloBoeira要区分参数和选项,可以使用双破折号-,在双破折号-,之后所有参数都不会被解释为选项:foo-u jack-ls-al。它还可以告诉clap在第一个非选项参数之后不要解析选项,但我对此并不确定。我实际上正在考虑放弃clap,因为如果没有它,做一些像FooUser这样的事情似乎更容易command@MarceloBoeira查看文档,它看起来就是这么做的。它不是那么简单,后面的VarArg允许这样做,但您仍然需要自己进行一些解析。。。