Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Error handling 为什么要对.or_else()进行两次调用?_Error Handling_Rust - Fatal编程技术网

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()!()