use linked_list::LinkedList;
use std::iter::FromIterator;
fn main() {
// LinkedList::cursor takes &mut self, so lst must be mutable
let mut lst = LinkedList::from_iter(0..10);
let mut c = lst.cursor();
c.next();
c.next();
c.next();
c.prev();
assert_eq!(1, *c.prev().unwrap());
}
3条答案
按热度按时间ncgqoxb01#
Iterator
类似于C++的ForwardIterator
,您想要的是BidirectionalIterator
,但是Rust没有提供类似的trait,因为类型系统的限制。正如Matthieu M在注解中所说的,迭代器的定义方式允许保留对生成元素的引用。如果迭代器产生可变引用,这就是一个问题,因为向前和向后移动将允许对同一元素的多个可变引用。解决这个问题的一个方法是将生成元素的生命周期与
&mut self
绑定。因此,对next
(或prev
)调用将借用self
,但是无法以通用方式来实现(存在RFC来添加这种能力)。查看
Iterator
特征定义:我们可以看到
Self::Item
的生存期与'a
无关,解决这个问题需要:但是这还不被支持。
也就是说,一种选择是使用一个使用特定迭代器外部crate(也就是说,不实现trait)
linked_list
crate为Cursor
提供了一个链表实现,它允许向前和向后迭代:Cursor
不允许保留对生成的元素的引用。Cursor
类似于迭代器,除了它可以自由地来回查找,并且可以在迭代过程中安全地改变列表。这是因为它所生成的引用的生存期与它自己的生存期相关联,而不仅仅是底层列表的生存期。这意味着游标不能一次生成多个元素。下面的例子:
生成此错误:
这是因为
next
(和prev
)借用了self
,即:pinkon5k2#
你需要实现自己的迭代器来完成这个任务,下面是一个
Vec
s的迭代器的示例实现:这个打印出来
w6lpcovy3#
此实现允许您使用
from_iter
函数从迭代器创建List
,并使用into_iter
函数将List
转换为迭代器。IntoIter
类型是使用List
的迭代器,next
方法以插入元素的顺序返回列表元素。