gpt4 book ai didi

error-handling - 为什么 .or_else() 会被调用两次?

转载 作者:行者123 更新时间:2023-11-29 08:22:04 27 4
gpt4 key购买 nike

Result docs.or_else()给出以下解释方法:

fn or_else<F, O: FnOnce(E) -> Result<T, F>>(self, op: O) -> Result<T, F>

Calls op if the result is Err, otherwise returns the Ok value of self.

This function can be used for control flow based on result values.

Examples

fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }

fn err(x: u32) -> Result<u32, u32> { Err(x) }

assert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));

assert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));

assert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));

assert_eq!(Err(3).or_else(err).or_else(err), Err(3));

认为可以解析 or_else带有更多空格的类型注释:

fn or_else<F,                           // F being the return type of the Result?
O: FnOnce(E) -> Result<T, F> // the function to run instead if error
>
(self, op: O) // arguments to the `.or_else()` method
-> Result<T, F> // return type is again Result

假设我没猜错,这是否意味着 .or_else()简单地给你一个ResultError替换为 op 的返回值功能?

我可以理解返回 Result再一次,因为可能抛出错误的代码下游的所有代码都被“污染”,可能会出现更多错误(并且由调用者来处理)。但是为什么示例中的调用加倍?有几个不同的排列,但我不确定他们试图显示什么(或者加倍的 or_else() 模式是否是惯用的)。

最佳答案

这个例子可能有点不幸,因为它试图同时显示or_else工作,为什么要使用它。

把它分成两部分。首先是什么 or_else实际上做。如果你接到电话Ok值,它传递 Ok值(value)。如果你调用 Err值,它执行函数。这个例子应该足够了:

Ok(2).or_else(sq), Ok(2) // not called
Ok(2).or_else(err), Ok(2) // not called
Err(2).or_else(sq), Ok(4) // called, succeeds
Err(2).or_else(err), Err(3) // called, fails

现在,你为什么要使用它的部分。想象一下你正在做一些有许多替代方法的操作。例如,你试图在 linux 上安装一些包,但不关心哪个包管理器可用——你只是要暴力破解它。所有函数返回 Result<...>你可以这样做:

install_with_apt().
or_else(install_with_yum).
or_else(install_with_pacman).
or_else(install_with_dnf).
or_else...

你会知道,如果你回来了Ok ,至少其中一个成功了,如果你回来了 Err他们都失败了。双倍的.or_else()示例中的用法可能只是想表明您可以轻松地链接此调用。

关于error-handling - 为什么 .or_else() 会被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38046593/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com