与仅返回 Ok() 分支相比,无误结果有什么意义?

Eva*_*oll 7 rust warp rust-result

Warp 拒绝处理程序的典型示例是

async fn handle_rejection(err: Rejection) -> Result<impl Reply, Infallible> {
Run Code Online (Sandbox Code Playgroud)

Result<ok, err>但是,这样的错误是绝对错误且永远无法达到的,有什么好处呢?为什么不直接返回一个impl Reply

mca*_*ton 16

它通常意味着以下两件事之一:

  • 该函数是特征的一部分,并且特征声明指示该方法可能失败并返回Result<T, E>. 现在,该特征的某些实现可能碰巧没有失败路径,并使用Infallible类似类型E

    一个标准库的例子就是特征FromStrFromStr在 上实施时显然会失败u32,但在 上实施时则不会失败String。因此impl FromStr for String用于std::convert::Infallible其错误情况。

  • 该函数将在需要一个容易出错的函数的上下文中使用。

    您的示例就是这种情况。handle_rejection被传递给warp::Filter::recover,它需要一个容易出错的函数。这是有道理的,因为并非所有错误都是可恢复的,因此recover可能仍然需要处理这些错误。

    现在,这是一个玩具示例,恰好能够处理所有错误,因此使用Infallible.