如何使用if,如何指定无法推断的类型?

时间:2018-06-13 15:32:26

标签: rust

我想用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)。不推断成功类型。

1 个答案:

答案 0 :(得分:2)

这与matchif 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>("") {
    //                            ^^^^^^^
}

另见: