我想用if let
撰写以下内容,但Ok(config)
未提供toml::from_str
let result: Result<Config, _> = toml::from_str(content.as_str());
match result {
Ok(config) => {}
_ => {}
}
// if let Ok(config) = toml::from_str(content.as_str()) {
//
// }
我没有运气就试过了Ok(config: Config)
。不推断成功类型。
答案 0 :(得分:2)
这与match
或if let
无关;类型规范由result
的分配提供。这个版本if let
有效:
extern crate toml;
fn main() {
let result: Result<i32, _> = toml::from_str("");
if let Ok(config) = result {
// ...
}
}
此版本match
不会:
extern crate toml;
fn main() {
match toml::from_str("") {
Ok(config) => {}
_ => {}
}
}
在大多数情况下,您实际上使用成功值。根据用法,编译器可以推断出类型,并且您不需要任何类型规范:
fn something(_: i32) {}
match toml::from_str("") {
Ok(config) => something(config),
_ => {}
}
if let Ok(config) = toml::from_str("") {
something(config);
}
如果由于某种原因您需要执行转换但不使用该值,则可以在函数调用中使用 turbofish :
match toml::from_str::<i32>("") {
// ^^^^^^^
Ok(config) => {},
_ => {}
}
if let Ok(config) = toml::from_str::<i32>("") {
// ^^^^^^^
}
另见: