首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于rust中的不同数据结构,有没有可能有一个统一的迭代器接口?

对于rust中的不同数据结构,有没有可能有一个统一的迭代器接口?
EN

Stack Overflow用户
提问于 2020-05-14 23:24:39
回答 1查看 56关注 0票数 1

我想要像下面这样的东西

代码语言:javascript
复制
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行为以获得最佳性能,但它不能编译,有什么解决方法可以实现这一点吗?

EN

回答 1

Stack Overflow用户

发布于 2020-05-14 23:55:40

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

代码语言:javascript
复制
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

另请参阅

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61801190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档