[英]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
块内发生了什么。
Err
后没有处理Ok
变体?r
是哪里来的?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.