rust 默认值-如何使用它

v6ylcynt  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(158)

第一次玩Rusts Clap Crate。而且我想知道如何使用命令行选项的默认值,当命令行中没有指定该选项时。
假设我在yaml文件中指定了default_value(见下面的代码片段),如果命令行中没有指定其他值,我希望matches.value_of("VERBOSE")返回默认值。
相反,我得到的是:
执行绪'main'在'呼叫None值上的Option::unwrap()时死机,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();

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

jjhzyzn0

jjhzyzn01#

问题是您对value_name(仅用于CLI帮助选项)有一点误解,或者您忽略了参数名称区分大小写。
您有两个选项可让此作业如预期般运作:
1.使用YAML(change .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"

rust eclipse :

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.使用代码(change .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"

rust 色

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);
}

相关问题