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

Pas*_*cal 7 rust

我想写以下内容if letOk(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()) {
//    
// }
Run Code Online (Sandbox Code Playgroud)

我尝试过Ok(config: Config)但没有运气。无法推断成功类型。

She*_*ter 5

这与match或无关if let;类型规范由对 的赋值提供result。这个版本的if let作品:

extern crate toml;

fn main() {
    let result: Result<i32, _> = toml::from_str("");
    if let Ok(config) = result {
        // ... 
    }
}
Run Code Online (Sandbox Code Playgroud)

此版本match没有:

extern crate toml;

fn main() {
    match toml::from_str("") {
        Ok(config) => {}
        _ => {}
    }
}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,您实际上会使用成功值。根据用法,编译器可以推断类型,并且您不需要任何类型规范:

fn something(_: i32) {}

match toml::from_str("") {
    Ok(config) => something(config),
    _ => {}
}

if let Ok(config) = toml::from_str("") {
    something(config);
}
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因您需要执行转换但不使用该值,您可以在函数调用中使用turbofish :

match toml::from_str::<i32>("") {
//                  ^^^^^^^
    Ok(config) => {},
    _ => {}
}

if let Ok(config) = toml::from_str::<i32>("") {
    //                            ^^^^^^^
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • @Pascal因为Shep猜测你的问题并不会让你的问题变得好。 (5认同)
  • 当反对票的根本原因被消除时,@Pascal 和反对票总是可以被删除;改进问题永远不会太晚。 (4认同)
  • @Stargateur 这个评论对OP没有帮助;其他人请不要投票支持这样的“训斥别人”的评论。来吧,人们;建设性的反馈意见。“你的问题很糟糕”没有任何帮助。 (3认同)
  • @Doug我不认为这是一个“责备”评论,感觉就像是对“为什么你对我的问题不满意,同时你又回答了它”的直接回应。这是真的:仅仅因为一个人可以从原始问题构建 MCVE 来回答它,并不意味着原始问题就很好。OP 已经就如何改进他们的问题提出了一些建议,并选择忽略这些建议。 (2认同)