簡體   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