簡體   English   中英

如何使用公共字段過濾不同結構的枚舉向量?

[英]How do I filter a vector of an enum of different structs using a common field?

我發現您可以使用枚舉創建不同類型結構的向量。 當過濾公共字段上的向量時,例如id ,編譯器在迭代時不知道類型:

use chrono::{DateTime, Utc}; // 0.4.19
use serde::{Serialize, Deserialize}; // 1.0.126

#[derive(Deserialize, Debug, Serialize, Clone)]
pub enum TransactionsEnum {
    TransactionOrderA(TransactionOrderA),
    TransactionOrderB(TransactionOrderB),
}
#[derive(Deserialize, Debug, Serialize, Clone)]
pub struct TransactionOrderA {
    pub id: i64,
    pub accountID: String,
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TransactionOrderB {
    pub id: i64,
    pub time: DateTime<Utc>,
}

fn transactions_filter(
    transactions_vector: Vec<TransactionsEnum>,
    x: i64,
) -> Vec<TransactionsEnum> {
    transactions_vector
        .into_iter()
        .filter(|e| e.id >= x)
        .collect()
}
error[E0609]: no field `id` on type `&TransactionsEnum`
  --> src/lib.rs:27:23
   |
27 |         .filter(|e| e.id >= x)
   |                       ^^

在所有枚舉值中共享一個公共值,有沒有辦法直接訪問枚舉結構中的字段值而無需模式匹配? 間接回答了我的問題,但這里提供的答案幫助我理解了為什么需要match語句。

這些不是一個共同的領域,它們是完全不相關的領域。 就 Rust 編譯器而言,它們共享一個名稱的事實是微不足道的巧合。 您需要使用模式匹配從任何一種情況下獲取字段

impl TransactionsEnum {
    pub fn id(&self) -> i64 {
        match self {
            TransactionsEnum::TransactionOrderA(value) => value.id,
            TransactionsEnum::TransactionOrderB(value) => value.id,
        }
    }
}
transactions_vector
    .into_iter()
    .filter(|e| e.id() >= x) // Note the parentheses since we're calling a function now
    .collect()

暫無
暫無

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

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