简体   繁体   English

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

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

The following code example is the best that I have come up with so far:以下代码示例是迄今为止我想出的最好的示例:

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);
}

I would like to know if there is a less verbose way of obtaining the vector of inner values (ie, Vec<u64> in the example).我想知道是否有一种不太冗长的方法来获取内部值的向量(即示例中的 Vec<u64> )。 It feels like I might be able to use something like try_from or try_into to make this less verbose, but I cannot quite get there.感觉好像我可以使用try_fromtry_into类的东西来减少冗长,但我不能完全做到。

Enums are not "special" and don't have much if any implicitly associated magic, so by default yes you need a full match -- or at least an if let eg枚举不是“特殊的”,如果有任何隐式关联的魔法,也没有太多,所以默认情况下是的,你需要一个完整的匹配——或者至少一个if let例如

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

However nothing prevents you from implementing whatever utility methods you're thinking of on your enum eg get_a which would return an Option<A> (similar to Result::ok and Result::err ), or indeed to implement TryFrom on it:然而,没有什么能阻止您在枚举上实现您正在考虑的任何实用方法,例如get_a它将返回一个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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM