我不知道如何在下面的代码片段中实现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()
......这将失败,因为“创建一个临时的,在仍然使用的时候释放它”。
发布于 2021-01-24 02:16:38
弄明白了:
self.current
.borrow()
.children()
.clone()
.into_iter()
.map(|n| Self::new(n))通过这种方式,您可以返回已被转换为迭代器的克隆Vec。
https://stackoverflow.com/questions/65866494
复制相似问题