我正在使用the Clap crate解析命令行参数。我定义了应该列出文件的子命令ls。 Clap还定义了help子命令,该子命令显示有关应用程序及其使用情况的信息。

如果未提供任何命令,则什么都不会显示,但是在这种情况下,我希望该应用程序显示帮助。

我已经试过了这段代码,看起来很简单,但是却行不通:

extern crate clap;

use clap::{App, SubCommand};

fn main() {
    let mut app = App::new("myapp")
        .version("0.0.1")
        .about("My first CLI APP")
        .subcommand(SubCommand::with_name("ls").about("List anything"));
    let matches = app.get_matches();

    if let Some(cmd) = matches.subcommand_name() {
        match cmd {
            "ls" => println!("List something here"),
            _ => eprintln!("unknown command"),
        }
    } else {
        app.print_long_help();
    }
}

我收到一个在移动后使用app的错误:

error[E0382]: use of moved value: `app`
  --> src/main.rs:18:9
   |
10 |     let matches = app.get_matches();
   |                   --- value moved here
...
18 |         app.print_long_help();
   |         ^^^ value used here after move
   |
   = note: move occurs because `app` has type `clap::App<'_, '_>`, which does not implement the `Copy` trait

仔细阅读Clap的文档,我发现clap::ArgMatches中返回的get_matches()具有一种 usage 方法,该方法返回使用部分的字符串,但不幸的是,仅此部分,而没有其他内容。

最佳答案

使用 clap::AppSettings::ArgRequiredElseHelp :

App::new("myprog")
    .setting(AppSettings::ArgRequiredElseHelp)

也可以看看:
  • Method call on clap::App moving ownership more than once
  • 关于rust - 没有提供命令时,Clap有什么简单的方法可以显示帮助?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49290526/

    10-09 19:40