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的回答,其中我描述了FromError
与try!
一起使用,但意识到它对方法链式没有帮助在那里使用。
答案 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)),
}
}
......但我不相信会发生这种情况,因为它们会被标记为稳定,而且只是稍微向后兼容的变化。