小编ECO*_*ECO的帖子

正确解析 Clap ArgMatches 的惯用 rust 方法

我正在学习 Rust 并尝试找到类似的实用程序(是的另一个),我使用 clap 并尝试支持程序参数的命令行和配置文件(这与 clap yml 文件无关)。

我正在尝试解析命令,如果没有命令传递到应用程序,我将尝试从配置文件加载它们。现在我不知道如何以惯用的方式做到这一点。

fn main() {
    let matches = App::new("findx")
        .version(crate_version!())
        .author(crate_authors!())
        .about("find + directory operations utility")
        .arg(
            Arg::with_name("paths")
               ...
        )
        .arg(
            Arg::with_name("patterns")
              ...
        )
        .arg(
            Arg::with_name("operation")
            ...
        )
        .get_matches();
    let paths;
    let patterns;
    let operation;
    if matches.is_present("patterns") && matches.is_present("operation") {
        patterns = matches.values_of("patterns").unwrap().collect();
        paths = matches.values_of("paths").unwrap_or(clap::Values<&str>{"./"}).collect(); // this doesn't work
        operation = match matches.value_of("operation").unwrap() { // I dont like this
            "Append" => Operation::Append,
            "Prepend" => Operation::Prepend,
            "Rename" => Operation::Rename,
            _ => {
                print!("Operation …
Run Code Online (Sandbox Code Playgroud)

rust clap

6
推荐指数
1
解决办法
4391
查看次数

如果让表达式使用赋值运算符而不是等于运算符,为什么还要Rust?

我试图把我的头缠在if let表达式周围,我发现它太违反直觉了。我知道它的作用,但是我无法找到一些细节背后的理由。

第一个细节是赋值运算符的使用而不是比较,第二个细节是操作数的放置。

例如:

    let a = Some(5);

    if let Some(i) = a {
        println!("Hello, {}!", i);
    }
Run Code Online (Sandbox Code Playgroud)

在我看来,这种方式更“清晰”:

    if let Some(i) == a {
        println!("Hello, {}!", i);
    }
Run Code Online (Sandbox Code Playgroud)

甚至更好:


    if let a == Some(i) {
        println!("Hello, {}!", i);
    }
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解背后的原因吗?

rust

1
推荐指数
1
解决办法
86
查看次数

标签 统计

rust ×2

clap ×1