繁体   English   中英

模式匹配如何与 Rust 中的 ref 一起工作?

[英]How does pattern matching work with ref in Rust?

刚刚从这里遇到了这段代码:

...
    let mut txn = client.transaction()?;
    loop {
        let mut sp = txn.savepoint("cockroach_restart")?;
        match op(&mut sp).and_then(|t| sp.commit().map(|_| t)) {
            Err(ref err)
                if err
                    .code()
                    .map(|e| *e == SqlState::T_R_SERIALIZATION_FAILURE)
                    .unwrap_or(false) => {}
            r => break r,
        }
    }
    .and_then(|t| txn.commit().map(|_| t))
...

目前还不清楚match块内发生了什么。

  1. 为什么在处理Err后没有处理Ok变体?
  2. r是哪里来的?
  3. err.code()...的逻辑是什么? 它是从指针到 bool 的映射,然后在 bool 上展开??? 然后什么都不做?

为什么在处理Err后没有处理Ok变体?

匹配的第二个 arm 是一个匹配任何值的包罗万象的模式,因此它涵盖了Ok变体以及第一个变体中的保护失败的Err变体。

r是哪里来的?

当使用r之类的标识符作为模式时,它表示捕获匹配值的新局部变量。

err.code() ...的逻辑是什么?

postgres::Error::code()返回一个Option<&SqlState> 如果提供了代码(选项为Some ),并且等于SqlState::T_R_SERIALIZATION_FAILURE ,则循环继续。 如果它不是T_R_SERIALIZATION_FAILURE或未提供(选项为None ),则匹配保护返回 false 并改为执行 catch-all 模式,停止循环。

逐步解开对code()的处理:

  • postgres::Error::code()返回Option<&SqlState>
  • Option<&SqlState>::map(closure)Option<&SqlState>映射到Option<type returned by the closure> 仅在选项为Some选项时才调用闭合,否则可以Option::map返回None 由于我们的闭包只计算 a == ,它返回bool并且map因此返回Option<bool> (闭包必须使用*来取消引用该值,因为它接收&SqlState 。)
  • Option<bool>::unwrap_or(default_value)如果选项为Some则计算为选项中的值,如果为None则计算为default_value ,有效地将Option<bool>转换为bool ,这是我们对if所需要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM