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