Enums 如何处理平面图中的单个元素?
是否可以在锈迹斑斑的平面地图中处理不同数量的元素 我有一个例子,根据一个条件,我需要映射单个Enums 如何处理平面图中的单个元素?,enums,rust,Enums,Rust,是否可以在锈迹斑斑的平面地图中处理不同数量的元素 我有一个例子,根据一个条件,我需要映射单个enum元素或enum元素的向量 我试图使用std::iter::once但它不起作用,因为once和Vec::iter是不同的类型,无法从相同的if条件返回 enum枚举{ 标识(字符串), Val(i32), } fn main(){ 让我的_vec=vec![1,2,3]; let condition=true;//任何条件 我的车 .国际热核实验堆(iter) .平面图(|x|){ 如果条件{ s
enum
元素或enum
元素的向量
我试图使用std::iter::once
但它不起作用,因为once
和Vec::iter
是不同的类型,无法从相同的if
条件返回
enum枚举{
标识(字符串),
Val(i32),
}
fn main(){
让我的_vec=vec![1,2,3];
let condition=true;//任何条件
我的车
.国际热核实验堆(iter)
.平面图(|x|){
如果条件{
std::iter::one(Enum::Ident(“id.”to_string())。放入_iter()/*单个Enum元素*/
}否则{
vec![Enum::Val(1),Enum::Val(2)].iter()/*枚举元素的向量*/
}
})
收集::()
}
错误[E0308]:`if`和`else`的类型不兼容
-->src/main.rs:16:17
|
13 |/if条件{
14 | | std::iter::once(Enum::Ident(“id.”to_string())。放入_iter()/*单个Enum元素*/
||--------------------------------------------------------------正是因为这个原因
15 | |}其他{
16 | | vec![Enum::Val(1),Enum::Val(2)].iter()/*枚举元素的向量*/
|| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
17 | | }
||uuuuuuuuuuuuuuuuuuuu-`if`和`else`的类型不兼容
|
=注意:应为'std::iter::Once'类型`
found struct`std::slice::Iter显而易见的解决方案是在两种情况下都使用向量:
my_vec
.iter()
.flat_map(|_| {
if condition {
vec![Enum::Ident("id".to_string())].into_iter()
} else {
vec![Enum::Val(1), Enum::Val(2)].into_iter()
}
})
.collect::<Vec<Enum>>();
板条箱使用变量Left
和Right
定义通用枚举。如果两侧的类型都支持迭代,则枚举还通过分配到相应的底层迭代器类型来支持迭代。是否可以在不为单个元素分配向量的情况下执行此操作?也许会以某种方式将其转换为迭代器?请查看答案的最新版本。或
解决方案看起来正是我所需要的。对于match
子句(在超过两个分支的情况下)是否有类似的解决方案?@Ivan我不知道有这样的解决方案。您可以自己搜索一个,但在这种情况下,编写自己的枚举可能会更好——这可能会使代码更具可读性。也就是说,额外的分配是不可能的——它几乎不可能,所以请考虑这个解决方案。
use either::{Left, Right};
enum Enum {
Ident(String),
Val(i32),
}
fn main() {
let my_vec = vec![1, 2, 3];
let _ = my_vec
.iter()
.flat_map(|&x| {
if x > 1 {
Left(std::iter::once(Enum::Ident("id".to_string())))
} else {
Right(vec![Enum::Val(1), Enum::Val(2)].into_iter())
}
})
.collect::<Vec<Enum>>();
}