如何在Rust中为某个集合类型(list / set / map)创建一个空迭代器?

时间:2015-08-29 08:59:15

标签: iterator rust

我想编写一个返回集合迭代器的方法(例如 LinkedList)。但在某些情况下,没有合适的集合可以返回 迭代器。在这种情况下,我想返回一个“空”迭代器 迭代没有元素。但我找不到任何相关的功能 在documentation中构建linked_list::Iter

考虑以下示例:

use std::collections::HashMap;
use std::collections::LinkedList;
use std::collections::linked_list;

pub struct Graph {
    nodes: HashMap<usize, LinkedList<usize>>,
}

impl Graph {
    pub fn adjacent_nodes(&self, node: usize) -> linked_list::Iter<usize> {
        match self.nodes.get(&node) {
            Some(x) => x.iter(),
            _ => linked_list::Iter::<usize>::new()
        }
    }
}

我想从adjacent_nodes的相邻节点返回一个迭代器 方法。但是当被问到不存在的节点的邻居时,该方法应该 显然,返回一个没有任何东西的迭代器。但我怎么能创造它呢?代码 我给的实际上没有编译:

src/graph.rs:13:18: 13:49 error: no associated item named `new` found for type
        `collections::linked_list::Iter<'_, usize>` in the current scope
src/graph.rs:13             _ => linked_list::Iter::<usize>::new()
                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我想,我可以用boxed::Box解决问题,但显然是一个问题 由于我试图避免不必要的堆分配,因此次优解决方案。

所以,我的问题是:在Rust中是否有可能创建一个迭代器 特定类型?

1 个答案:

答案 0 :(得分:4)

你不能这样做,不能使用by-reference迭代器,因为它们总是绑定到具体的集合实例。

你可以做的是将盒装迭代器作为特征对象返回:

pub fn adjacent_nodes<'a>(&'a self, node: usize) -> Box<Iterator<Item=usize>+'a> {
    match self.nodes.get(&node) {
        Some(x) => Box::new(x.iter()),
        _ => Box::new(::std::iter::empty())
    }
}

std::iter::empty()返回一个空的迭代器,但当然它的类型与集合迭代器的类型不同,所以你必须使用一个特征对象。我还必须添加一个生命周期参数,因为iter()返回的迭代器与self.nodes绑定,你需要向编译器解释它。