是否可以为rust中的不同数据结构提供统一的Iterator接口?

时间:2020-05-14 15:24:39

标签: rust iterator

我想要下面的东西

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行为最小化以获得最佳性能,但是它不能编译,是否有任何解决方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

假设您想拥有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

另请参见

相关问题