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

Mil*_*k27 4 rust

我有返回a Option或a的函数Result:

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?
}
Run Code Online (Sandbox Code Playgroud)

目前,没有Ok(())None允许被省略,如图上面的例子.这有什么理由吗?将来有可能改变这种情况吗?

Fre*_*ios 15

你不能在Rust中省略它.一个建议是为了允许()Result<(), _>强制规则,但它却极大地downvoted,然后拒绝了.

评论解释了为什么这是一个坏主意:

由于JavaScript,我非常警惕隐式强制(是的,我知道这是极端的).我一直很喜欢Rust的明确性,这就是我更喜欢其他RFC的原因.

这是我害怕的一个例子

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

if let Ok(_) = x {
    println!("this always prints");
}
Run Code Online (Sandbox Code Playgroud)

哎呀......在这种情况下,类型系统实际上会给出错误的信心.害怕.

此外,更一般地说,我希望该解决方案特定于退出函数或块.


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

fn ok<E>() -> Result<(), E> {
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

  • 我花了一段时间才明白这里发生了什么,这是我调试时可能发生的问题。我休息一下。做得好! (3认同)
  • @JeremyBanks不,目前,Rust标签中有一个Kirbymania。 (2认同)