[英]How to create an iterator that yields elements of a collection specified by a list of indices in 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.