Error handling 为什么要对.or_else()进行两次调用?
对于Error handling 为什么要对.or_else()进行两次调用?,error-handling,rust,Error Handling,Rust,对于或_else()方法,请给出以下解释: fn或_else Result>(self,op:O)->结果 如果结果为Err,则调用op,否则返回self的Ok值 此函数可用于基于结果值的控制流 例子 fn sq(x:u32)->结果{Ok(x*x)} fn err(x:u32)->结果{err(x)} assert\u eq!(好的(2)或其他(sq)或其他(sq),好的(2)) assert\u eq!(好的(2)或“其他”(错误)或“其他”(sq),好的(2)) assert\u eq!(
或_else()
方法,请给出以下解释:
fn或_else Result>(self,op:O)->结果
如果结果为Err,则调用op,否则返回self的Ok值
此函数可用于基于结果值的控制流
例子
fn sq(x:u32)->结果{Ok(x*x)}
fn err(x:u32)->结果{err(x)}
assert\u eq!(好的(2)或其他(sq)或其他(sq),好的(2))代码>
assert\u eq!(好的(2)或“其他”(错误)或“其他”(sq),好的(2))代码>
assert\u eq!(错误(3)或其他(sq)或其他(错误),Ok(9))代码>
assert\u eq!(错误(3)或其他(错误)或其他(错误),错误(3))代码>
我认为可以用更多的空格解析或_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
fn或_elseresult//如果出现错误,则改为运行函数
>
(self,op:O)//方法`.or_else()`的参数
->Result//返回类型再次为Result
假设我没有弄错,这是不是意味着。或者_else()
只是给你一个结果
,其中错误
被替换为op
函数的返回值
我可以再次理解返回一个结果,因为可能抛出错误的代码下游的所有代码都被进一步错误的可能性“玷污”(这取决于调用方如何处理)。但为什么在例子中会出现双重呼吁?有两种不同的排列方式,但我不确定它们试图显示什么(或者这两个或_else()
模式是否是惯用的)。这个示例可能有点不幸,因为它试图同时显示或_else
如何工作,以及您为什么要使用它
把它分成两部分。首先是或其他
的实际作用。如果在Ok
值上调用它,它将传递Ok
值。如果在Err
value上调用它,它将执行该函数。这个例子应该足够了:
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
,所有这些都失败。本例中使用了加倍的。或_else()!()
?