我更喜欢使用let Else语句,因为它go 掉了代码中的嵌套

let Ok(result) = function_call_that_returns_a_result() else {
   return "error message".into();
}

但是,如果我使用if let、Else或Match语句,我可以访问内部的实际错误消息.

if let Err(err) = function_call_that_returns_a_result() {
  return format!("Error: {}", error).into();
}

有什么简单的方法可以避免使用第二种方法吗?因为如果我像这样使用它,我会得到额外的嵌套.

if let Some(value) = function_call_that_returns_a_result() {
   // value is available one level nested
}

其他方法也值得考虑.我希望避免两次判断相同的可选代码,否则,我只会判断一次,打印错误,然后在确保它不包含错误后解开().然而,这种方法感觉很笨拙.

推荐答案

let-else没有,但有另一种可用的 struct ,在let-else之前使用的 struct :

let result = match function_call_that_returns_a_result() {
    Ok(result) => result,
    Err(error) => return format!("Error: {}", error).into(),
};

这样,您就避免了嵌套,但有一些Ok(result) => result的代码重复.

Rust相关问答推荐

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

为什么这是&q;,而让&q;循环是无限循环?

自定义结果枚举如何支持`?`/`FromResidual`?

Tokio_Postgres行上未显示退回特性的生存期,且生命周期 不够长

Trait bound i8:来自u8的不满意

当发送方分配给静态时,Tokio MPSC关闭通道

实现AsyncWrite到hyper Sender时发生生命周期错误

在不安全的 Rust 中存储对 struct 内部数据的静态引用是否合法?

从光标位置旋转精灵

为什么 `tokio::join!` 宏不需要 Rust 中的 `await` 关键字?

Some(v) 和 Some(&v) 有什么区别?

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

如何获取函数中borrow 的切片的第一部分?

是否可以在 Rust 中的特定字符上实现特征?

为什么在 rust 中删除 vec 之前应该删除元素

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

具有生命周期和以后引用的可变方法

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

在 Rust 中组合特征的不同方法是否等效?