2

第一次玩 Rusts 拍板箱。而且我想知道如何在命令行未指定选项时使用命令行选项的默认值。

鉴于我default_value在 yaml 文件中指定了 a (请参见下面的代码段),matches.value_of("VERBOSE")如果命令行中没有给出其他值,我希望返回默认值。

相反,我得到:

线程“主”在“调用Option::unwrap()一个None值”时惊慌失措,src/main.rs:18:6

我在谷歌上搜索了一段时间,但似乎没有人真正给出一个规范的例子来说明它应该如何工作。

...
args:
  - config:
      short: c
      long: config
      value_name: CONFIG
      help: Specifies the config file to use.
      takes_value: true
      default_value: ""
  - verbose:
      short: v
      long: verbose
      value_name: VERBOSE
      help: Sets verbosity. 0 = silent, > 0 = verbose.
      takes_value: true
      default_value: "1"

在这里,我的微弱尝试......编译但无法正常工作(如果使用空命令行,则会出现恐慌)。

// ...
    let yaml = load_yaml!("cli.yml");
    let matches = App::from_yaml(yaml).get_matches();
    let verbosity =
    matches.value_of("VERBOSE")
    .and_then(|s| s.parse::<u8>().ok())
    .unwrap();

由于这显然不使用默认值,所以我的简单问题是:我该怎么做?

4

1 回答 1

3

value_name问题是您要么对什么(仅用于 CLI 帮助选项)有一点误解,要么您错过了参数名称区分大小写的问题。

您有两种选择可以使这项工作按预期进行:

  1. 使用 YAML 中指定的小写参数名称(更改 .rs):

YAML:

...
args:
  - config:
      short: c
      long: config
      value_name: CONFIG
      help: Specifies the config file to use.
      takes_value: true
      default_value: "1"
  - verbose:
      short: v
      long: verbose
      value_name: VERBOSE
      help: Sets verbosity. 0 = silent, > 0 = verbose.
      takes_value: true
      default_value: "1"

锈:

use clap::{load_yaml, App};

fn main() {
    let yaml = load_yaml!("cli.yml");
    let matches = App::from_yaml(yaml).get_matches();
    let verbosity =
    matches.value_of("verbose")
    .and_then(|s| s.parse::<u8>().ok())
    .unwrap();
    println!("{}", verbosity);
}
  1. 使用代码中指定的大写名称(更改 .yaml): YAML:
...
args:
  - config:
      short: c
      long: config
      value_name: CONFIG
      help: Specifies the config file to use.
      takes_value: true
      default_value: "1"
  - VERBOSE:
      short: v
      long: verbose
      value_name: VERBOSE
      help: Sets verbosity. 0 = silent, > 0 = verbose.
      takes_value: true
      default_value: "1"

use clap::{load_yaml, App};

fn main() {
    let yaml = load_yaml!("cli.yml");
    let matches = App::from_yaml(yaml).get_matches();
    let verbosity =
    matches.value_of("VERBOSE")
    .and_then(|s| s.parse::<u8>().ok())
    .unwrap();
    println!("{}", verbosity);
}
于 2021-04-22T05:00:30.540 回答