如何从env :: var返回匹配的值?

时间:2017-07-06 11:43:25

标签: rust match

如果找到环境变量SOMEVALUE,则应绑定到k

let k = match env::var(SOMEVALUE) {
    Ok(val) => {return val},
    Err(e) => println!("could not find {}: {}", SOMEVALUE, e),
};

编译此代码会出现以下错误

   |
11 |         Ok(val) => {return val},
   |                            ^^^ expected (), found struct `std::string::String`
   |
   = note: expected type `()`
              found type `std::string::String`

3 个答案:

答案 0 :(得分:6)

Victor写的内容是正确的,但您可能希望实际将值绑定到k;在这种情况下,您应该将代码更改为:

let k = match env::var(SOMEVALUE) {
    Ok(val) => val,
    Err(e) => panic!("could not find {}: {}", SOMEVALUE, e),
};

等效地,您可以使用Result::unwrap_or_else

let k = env::var(SOMEVALUE).unwrap_or_else(|e| {
    panic!("could not find {}: {}", SOMEVALUE, e)
});

答案 1 :(得分:1)

在Rust中,一切都是表达式,只有少数语句。每个表达式返回一个值,如果表达式没有显式返回任何内容,它会隐式返回()(单位)值。

您的match表达式会从2个分支返回不同的类型 - 来自std::String分支的Ok和来自()分支的Err

要解决这个问题,你必须从第二个分支返回一些东西:

let k = match env::var(SOMEVALUE) {
    Ok(val) => {return val},
    Err(e) => {
        println!("could not find {}: {}", SOMEVALUE, e);

        String::default()
    },
};

返回相同类型的值 - std::String

答案 2 :(得分:0)

接下来可以做的另一种选择(这只是说明我们如何使用env::var_os来达到相同的目的)

let spdk_dir = match env::var_os("SPDK_DIR") {
    Some(val) => val.into_string().unwrap(),
    None => panic!("SPDK_DIR is not defined in the environment")
};

在这里,我们尝试读取环境变量SPDK_DIR,如果未定义,则退出程序。