如何将枚举向量转换为该枚举特定变体的内部值向量
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_from
或 try_into
之类的东西来减少冗长,但我不能完全做到这一点。
枚举不是“特殊”的,如果有任何隐式关联的魔法,也没有多少,所以默认情况下是的,你需要一个完全匹配——或者至少是一个 if let
例如
if let Variant::VariantA(inner) = el { Some(inner) } else { None }
但是没有什么可以阻止您在枚举上实现您正在考虑的任何实用方法,例如get_a
会 return 一个 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);
}
以下代码示例是迄今为止我想到的最好的代码示例:
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);
}
我想知道是否有更简洁的方法来获取内部值向量(即示例中的 Vectry_from
或 try_into
之类的东西来减少冗长,但我不能完全做到这一点。
枚举不是“特殊”的,如果有任何隐式关联的魔法,也没有多少,所以默认情况下是的,你需要一个完全匹配——或者至少是一个 if let
例如
if let Variant::VariantA(inner) = el { Some(inner) } else { None }
但是没有什么可以阻止您在枚举上实现您正在考虑的任何实用方法,例如get_a
会 return 一个 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);
}