我可以从函数中自动返回Ok(())或None吗?

时间:2018-10-26 13:42:16

标签: rust

我有一些返回OptionResult的函数:

fn get_my_result() -> Result<(), Box<Error>> {
    lots_of_things()?;
    Ok(()) // Could this be omitted?
}

fn get_my_option() -> Option<&'static str> {
    if some_condition {
        return Some("x");
    }

    if another_condition {
        return Some("y");
    }

    None // Could this be omitted as well?
}

当前,不允许Ok(())None省略,如上面的示例所示。有什么理由吗?将来有可能对此进行更改吗?

1 个答案:

答案 0 :(得分:14)

您不能在Rust中忽略它。制定了proposal以允许使用()Result<(), _>强制规则,但该规则被大为否决,然后被拒绝。

A comment很好地解释了为什么这是一个坏主意:

  

由于JavaScript,我对隐式强制非常谨慎(是的,   我知道这很极端)。我一直很喜欢   Rust,这就是为什么我更喜欢另一个RFC的原因。

     

这是我担心的事情的一个例子

let x = {
    // Do some stuff
    ...
    if blah {
        Ok(())
    } else {
        Err("oh no");
   }
};

if let Ok(_) = x {
    println!("this always prints");
}
     

糟糕...在这种情况下,类型系统实际上会给出false   置信度。吓人。

     

此外,更一般而言,我希望解决方案特定于   退出功能或块。


当我的代码中有很多Ok(())时,我创建了一个小的辅助函数来使代码更漂亮:

fn ok<E>() -> Result<(), E> {
    Ok(())
}