无误结果的意义在于什么,与仅返回Ok()分支有何不同?

7

Warp 拒绝处理器的典型示例是这个

async fn handle_rejection(err: Rejection) -> Result<impl Reply, Infallible> {

但是,如果err是Infallible类型并且永远不会被触发,那么使用Result<ok, err>有什么优势呢?为什么不直接返回impl Reply呢?


1
它主要用于通用编程,例如,当特征可以使用关联类型返回错误,但实际上可能并不代表可失败操作时。 - apetranzilla
1个回答

15
通常有两种情况:
  • 该函数是trait的一部分,并且trait声明表明该方法可能失败并返回Result<T, E>。现在,该trait的某些实现可能没有失败路径,并对E使用类似于Infallible的类型。

    标准库的一个例子是FromStr trait。当在u32上实现FromStr时,显然可能会失败,但在String上实现时则不会失败。因此,impl FromStr for String在其错误情况下使用std::convert::Infallible

  • 该函数将用于期望可失败函数的上下文中。

    这是你的例子。 handle_rejection被传递给warp::Filter::recover,该函数期望一个可失败函数。这是有道理的,因为并非所有错误都是可恢复的,因此recover可能仍然需要处理这些错误。

    现在,这只是一个玩具示例,可以处理所有错误,因此使用Infallible


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接