[英]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_from
或try_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::ok
和Result::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.