自动使用 from_error 的 map_err 等价物

Equivalent of map_err that uses from_error automatically

Result 有一个 map_err 函数,允许您通过将函数应用于错误值来将 Result<T, E> 映射到 Result<T, F>

对于实现 FromError 的类型,应用的最自然的函数就是 FromError::from_error,导致如下内容:

foo()
  .map_err(FromError::from_error)
  .and_then(|val| {
      val.do_something().map_err(FromError::from_err)
  })

对于这种用例,似乎应该在 Result<T, E> where E: Error 上定义一个不那么繁琐的方法,它调用 FromError::from_error 的方式不那么冗长,类似于下面的方法,但名称更好:

foo()
  .wrap_err()
  .and_then(|val| {
      val.do_something().wrap_err()
  })

这相当于 .map_err(FromError::from_error),当您进行这种方法链接时,它更短更方便。

在任何地方都定义过这样的东西吗?我找不到它,但我不确定我是否在文档中的所有正确位置查找。

这个问题启发了我对 this one 的回答,其中我描述了 FromErrortry! 一起使用,但意识到它对方法链接风格没有帮助正在那里使用。

至少目前还没有这样的方法。我相信在实际情况下 try! 比方法链方法更常用(在我看来它往往会产生更好的代码),所以它并不是一个重要的考虑因素。

作为设计考虑因素可能更有趣的是改变 and_then 等。使用 FromError:

pub fn and_then<U, E2: FromError<E>, F: FnOnce(T) -> Result<U, E2>>
               (self, op: F) -> Result<U, E2> {
    match self {
        Ok(t) => op(t),
        Err(e) => Err(FromError::from_error(e)),
    }
}

…但我不相信这会发生,因为它们被标记为稳定并且这将是一个稍微向后不兼容的更改。