簡體   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