我无法弄清如何在以下代码段中实现children_iter
:
use std::{cell::RefCell, rc::Rc};
struct Node {
children: Vec<Rc<RefCell<Node>>>,
}
struct NodeIterator {
current: Rc<RefCell<Node>>,
}
impl NodeIterator {
fn new(node: Rc<RefCell<Node>>) -> NodeIterator {
NodeIterator { current: node }
}
/// Returns an iterator over the children of the current node wrapped in a NodeIterator
fn children_iter(&self) -> impl Iterator<Item = NodeIterator> {
self.current ‣Rc<RefCell<Node>>
.borrow() ‣Ref<Node>
.children ‣Vec<Rc<RefCell<Node>>>
.iter() ‣Iter<Rc<RefCell<Node>>>
.map(|n| Self::new(n.clone())) ‣&Rc<RefCell<Node>>
}
}
问题是我不确定在迭代器返回时,它应该包含什么子元素。我尝试了几种不同的方法:
- 也许我可以将迭代器与
self
的生命周期绑定?:
fn children_iter<'a>(&'a self) -> impl 'a + Iterator<Item=NodeIterator>
这种情况会失败,因为它返回当前函数所拥有的数据
- 或许我可以使
self
被消耗,这样我们就不需要保留对它的任何引用了吗?
fn children_iter(self) -> impl Iterator<Item=NodeIterator>
出现错误:self.current
存活时间不足
- 我还尝试过克隆
Rc
,以便它不引用 self 中的那个对象
self.current
.clone()
.borrow()
......
这个操作会出现“创建一个在使用过程中被释放的临时对象”的错误。