微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我发现您可以使用枚举创建不同类型结构的向量。在公共字段上过滤向量时,例如 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,Clone)]
pub struct TransactionorderA {
    pub id: i64,pub accountID: String,}

#[derive(Serialize,Deserialize,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)
   |                       ^^

Sharing a common value in all enum valuesIs there a way to directly access a field value in an enum struct without pattern matching? 间接回答了我的问题,但此处提供的答案帮助我理解了为什么需要 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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。