如果找到环境变量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`
答案 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
,如果未定义,则退出程序。