簡體   English   中英

使用模式匹配反序列化時出現類型不匹配錯誤

[英]Mismatched types error while deserializing with pattern matching

我正在嘗試根據傳遞給 function 的值將 csv 值反序列化為不同類型的結構。

我不明白為什么會收到mismatched types的錯誤。 當它位於不同的匹配項 arm 中時,為什么它會找到 struct CitiRec

pub fn get_uncat_rec(path: &PathBuf, bank_type: BankType) -> Vec<UnCatRecord> {
  let mut reader = csv::Reader::from_path(path).unwrap();
  let mut uncat_rec: Vec<UnCatRecord> = Vec::new();

  for record in reader.deserialize() {
    match bank_type {
      BankType::Citi => {
        let rec_result: Result<CitiRec, csv::Error> = record;
        match rec_result {
          Ok(rec_result) => {
            uncat_rec.push(rec_result.to_uncat_rec());
          }
          Err(err) => {
            println!("Error received deserializing Citi Record: {}", err);
          }
        }
      }
      BankType::Kasaka => {
        let rec_result: Result<KasakaRec, csv::Error> = record; <-- **error here**
        match rec_result {
          Ok(rec_result) => {
            uncat_rec.push(rec_result.to_uncat_rec());
          }
          Err(err) => {
            println!("Error received deserializing Kasaka Record: {}", err);
          }
        }
      }
      _ => {}
    }

這是收到的錯誤:

error[E0308]: mismatched types                                                                                                                                                                                                                       
  --> src\normalizer.rs:26:57
   |
26 |         let rec_result: Result<KasakaRec, csv::Error> = record;
   |                         -----------------------------   ^^^^^^ expected struct `KasakaRec`, found struct `CitiRec`
   |                         |
   |                         expected due to this
   |
   = note: expected enum `Result<KasakaRec, _>`
              found enum `Result<CitiRec, _>`

類型不能是有條件的。 record有一個,而且只有一個類型。

從第一個match項 arm 開始,編譯器得出結論,您正在反序列化為CitiRec s。 但是在第二個中,您似乎正在反序列化為KasakaRec s,這是一個沖突。

解決這個問題的一種方法是為每個 arm 設置一個單獨的循環,這樣我們就可以反序列化為不同的類型:

pub fn get_uncat_rec(path: &PathBuf, bank_type: BankType) -> Vec<UnCatRecord> {
    let mut reader = csv::Reader::from_path(path).unwrap();
    let mut uncat_rec: Vec<UnCatRecord> = Vec::new();

    match bank_type {
        BankType::Citi => {
            for record in reader.deserialize() {
                let rec_result: Result<CitiRec, csv::Error> = record;
                match rec_result {
                    Ok(rec_result) => {
                        uncat_rec.push(rec_result.to_uncat_rec());
                    }
                    Err(err) => {
                        println!("Error received deserializing Citi Record: {}", err);
                    }
                }
            }
        }
        BankType::Kasaka => {
            for record in reader.deserialize() {
                let rec_result: Result<KasakaRec, csv::Error> = record;
                match rec_result {
                    Ok(rec_result) => {
                        uncat_rec.push(rec_result.to_uncat_rec());
                    }
                    Err(err) => {
                        println!("Error received deserializing Kasaka Record: {}", err);
                    }
                }
            }
        }
        _ => {}
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM