Result开始,我想对它运行一个副作用,如果它是Err(比如记录错误)并返回错误,那么最常用的方法是什么?

我可以这样做:

fn do_something() -> Result<(), MyError> {...}

fn foo() -> Result<(), MyError> {
  do_something()
    .map_err(|err| { 
      println!("Got error in Foo: {:#?}", err);
      err
    })?;
  ...
}

但我不太喜欢这样,因为这感觉像是滥用了map_xxx:我在map...函数上做了一个副作用,我甚至没有将错误映射到其他东西上.

我想这会使副作用更加明显:

let result =  do_something();
if let Err(err) = result {
  println!("Got error in Foo: {:#?}", err);
  return Err(err);
}
...

但我觉得这太冗长了.理想情况下,我会期待着像这样的东西

do_something()
  .if_err(|err| {println!("Got error in Foo: {:#?}", err);})?;

推荐答案

在铁 rust 之夜,可以使用inspect_err方法.

do_something().inspect_err(|err| println!("Got error in Foo: {err:#?}"))?;

Rust相关问答推荐

如何容器化Linux上基于Rust的Windows应用程序的编译过程?

borrow 和内部IntoIterator

为什么复印是豆荚的一个重要特征?

如何定义实现同名但返回类型不同的 struct 的函数

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

在rust sqlx中使用ilike和push bind

无法将 rust 蚀向量附加到另一个向量

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

如何将 struct 数组放置在另一个 struct 的末尾而不进行内存分段

存储返回 impl Trait 作为特征对象的函数

在描述棋盘时如何最好地使用特征与枚举

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

为什么要这样编译?

从嵌入式 Rust 中的某个时刻开始经过的时间

返回迭代器的特征

如何将参数传递给Rust 的线程?

Rust 函数指针似乎被borrow 判断器视为有状态的

为什么我可以同时传递可变和不可变引用?

您如何使用枚举反序列化字符串,其中任何其他值反序列化为新类型变体同时保留字符串?