自动使用 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 的回答,其中我描述了 FromError
与 try!
一起使用,但意识到它对方法链接风格没有帮助正在那里使用。
至少目前还没有这样的方法。我相信在实际情况下 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)),
}
}
…但我不相信这会发生,因为它们被标记为稳定并且这将是一个稍微向后不兼容的更改。
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!
一起使用,但意识到它对方法链接风格没有帮助正在那里使用。
至少目前还没有这样的方法。我相信在实际情况下 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)),
}
}
…但我不相信这会发生,因为它们被标记为稳定并且这将是一个稍微向后不兼容的更改。