[英]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.