繁体   English   中英

如何在Rust中为特定集合类型(列表/集合/地图)创建一个空的迭代器?

[英]How to create an empty iterator for a certain collection type (list/set/map) in Rust?

我想编写一个返回集合迭代器的方法(例如LinkedList )。 但是在某些情况下,没有合适的集合可以返回迭代器。 在这种情况下,我想返回一个“空”迭代器,该迭代器不对任何元素进行迭代。 但是我在文档中找不到任何关联的函数来构造一个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中是否可以创建特定类型的迭代器?

您不能使用按引用迭代器来做到这一点,因为它们始终与具体的集合实例绑定在一起。

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

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()返回一个空的迭代器,但是它的类型与集合迭代器的类型不同,因此必须使用trait对象。 我还必须添加一个生命周期参数,因为iter()返回的迭代器绑定到self.nodes ,并且需要向编译器解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM