vector - rust 是否可以为不同的数据结构提供统一的 Iterator 接口(interface)?

标签 vector rust enums hashmap iterator

这个问题在这里已经有了答案:





Conditionally iterate over one of several possible iterators

(4 个回答)


1年前关闭。




我想要下面的东西

use std::collections::HashMap;

pub enum DiffStruct {
    V(Vec<i32>),
    M(HashMap<i32,i32>),
}

impl DiffStruct {
    fn to_iter(self) -> impl IntoIterator<Item = i32> {
        match self {
            DiffStruct::V(vec) => vec.iter().into_iter(),
            DiffStruct::M(map) => map.values().into_iter(),
        }
    }
}

fn main() {
    let v: Vec<_> = DiffStruct::V(vec![1,2,3]).to_iter().collect();
}

playground

这样我就可以最小化 collect我的代码的行为以获得最佳性能,但它不能编译,有什么解决方法可以实现这一点?

最佳答案

假设您想要拥有 DiffStruct 的所有权而不仅仅是在收集它的值时借用它:

use std::collections::HashMap;

pub enum DiffStruct {
    V(Vec<i32>),
    M(HashMap<i32,i32>),
}

impl DiffStruct {
    fn to_iter(self) -> Box<dyn Iterator<Item = i32>> {
        match self {
            DiffStruct::V(vec) => Box::new(vec.into_iter()),
            DiffStruct::M(map) => Box::new(map.into_iter().map(|(_, v)| v)),
        }
    }
}

fn main() {
    let vec_values = vec![1, 2, 3];
    let mut map_values = HashMap::new();
    map_values.insert(1, 1);
    map_values.insert(2, 2);
    map_values.insert(3, 3);

    let ds_vec = DiffStruct::V(vec_values);
    let ds_map = DiffStruct::M(map_values);
    let collected_from_vec: Vec<_> = ds_vec.to_iter().collect();
    let collected_from_map: Vec<_> = ds_map.to_iter().collect();
}

playground

也可以看看
  • Conditionally iterate over one of several possible iterators
  • What is the correct way to return an Iterator?
  • 关于vector - rust 是否可以为不同的数据结构提供统一的 Iterator 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61801190/

    相关文章:

    c++ - 使用迭代器作为 vector 中的位置

    c++ - 可能吗? std::vector<双> my_vec(sz);已分配但未初始化或填充

    c++ - vector 未输出正确的值

    timer - 如何使用 Tokio 产生许多可取消的计时器?

    java - 这是 Java 中正确的枚举实践吗?

    r - 优化/向量化 R 中从输入向量的范围生成随机数的循环?

    rust - 在测试函数上声明生命周期

    rust-buildgen requestAnimationFrameLoop 无法在闭包内使用结构方法

    java - 访问枚举变量的私有(private)成员?

    c - C 中的枚举类型警告