如何将枚举向量转换为该枚举特定变体的内部值向量

How to convert a vector of enums into a vector of inner values of a specific variant of that enum

以下代码示例是迄今为止我想到的最好的代码示例:

enum Variant {
    VariantA(u64),
    VariantB(f64),
}

fn main() {
    let my_vec = vec![Variant::VariantA(1),
                      Variant::VariantB(-2.0),
                      Variant::VariantA(4),
                      Variant::VariantA(3),
                      Variant::VariantA(2),
                      Variant::VariantB(1.0)];

    let my_u64_vec = my_vec
        .into_iter()
        .filter_map(|el| match el {
            Variant::VariantA(inner) => Some(inner),
            _ => None,
        })
        .collect::<Vec<u64>>();

    println!("my_u64_vec = {:?}", my_u64_vec);
}

我想知道是否有更简洁的方法来获取内部值向量(即示例中的 Vec)。感觉我可以使用 try_fromtry_into 之类的东西来减少冗长,但我不能完全做到这一点。

枚举不是“特殊”的,如果有任何隐式关联的魔法,也没有多少,所以默认情况下是的,你需要一个完全匹配——或者至少是一个 if let 例如

if let Variant::VariantA(inner) = el { Some(inner) } else { None }

但是没有什么可以阻止您在枚举上实现您正在考虑的任何实用方法,例如get_a 会 return 一个 Option<A>(类似于 Result::okResult::err),或者实际上在其上实现 TryFrom

use std::convert::{TryFrom, TryInto};

enum Variant {
    VariantA(u64),
    VariantB(f64),
}

impl TryFrom<Variant> for u64 {
    type Error = ();

    fn try_from(value: Variant) -> Result<Self, Self::Error> {
        if let Variant::VariantA(v) = value { Ok(v) } else { Err(()) }
    }
}

fn main() {
    let my_vec = vec![Variant::VariantA(1),
                      Variant::VariantB(-2.0),
                      Variant::VariantA(4),
                      Variant::VariantA(3),
                      Variant::VariantA(2),
                      Variant::VariantB(1.0)];

    let my_u64_vec = my_vec
        .into_iter()
        .filter_map(|el| el.try_into().ok())
        .collect::<Vec<u64>>();

    println!("my_u64_vec = {:?}", my_u64_vec);
}