rust - 模式匹配如何与 Rust 中的 ref 一起工作?
问题描述
刚刚从这里遇到了这段代码:
...
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
。
- 为什么处理后没有处理
Ok
变体Err
? - 从哪里来
r
? - 有什么逻辑
err.code()...
?它是从指针到 bool 的映射,然后在 bool 上展开???然后什么都不做?
解决方案
为什么处理后没有处理
Ok
变体Err
?
匹配的第二个分支是一个匹配任何值的包罗万象的模式,因此它涵盖了Ok
变体,以及Err
第一个变体中的保护失败的变体。
从哪里来
r
?
当标识符 liker
用作模式时,它表示捕获匹配值的新局部变量。
……的逻辑是什么
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
,则计算选项中的值,default_value
如果是None
,则有效地转换Option<bool>
为 abool
,这是我们需要的if
.
推荐阅读
- python-3.x - 如果这是结果,如何循环回到 scetion
- python - 查找超过最小值或最大值的值
- mysql - sql中select语句的执行过程,其中在WHERE CONDITION cluase中指定了相同的表名
- python-3.x - 使用分层抽样将 pandas Dataframe 拆分为 4 部分
- c# - 如何从 CLR C++ 调用异步等待方法
- bluetooth - 使用 RSSI 计算近似距离
- java - 如何创建**数字**而不是字符串的任何数组列表?
- google-maps - 如何在 Xamarin Forms(Android 和 iOS)中实现 Google 地图?
- sas - If-then-else 在 SAS 中的工作原理
- android - Android - 展开视图的高度和宽度