相当于自动使用from_error的map_err

时间:2015-03-13 00:49:18

标签: rust

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!一起使用,但意识到它对方法链式没有帮助在那里使用。

1 个答案:

答案 0 :(得分:3)

目前至少没有这样的方法。我相信在实际情况下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)),
    }
}

......但我不相信会发生这种情况,因为它们会被标记为稳定,而且只是稍微向后兼容的变化。