我有一些返回Option
或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?
}
当前,不允许Ok(())
或None
省略,如上面的示例所示。有什么理由吗?将来有可能对此进行更改吗?
答案 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(())
}