如何使用公共字段过滤不同结构的枚举的向量



我发现可以使用枚举创建不同类型结构的向量。当在公共字段(如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()

最新更新