首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将迭代器返回到RefCell

将迭代器返回到RefCell
EN

Stack Overflow用户
提问于 2021-01-24 02:02:39
回答 1查看 162关注 0票数 3

我不知道如何在下面的代码片段中实现children_iter

代码语言:javascript
复制
  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?:的生命周期联系起来

代码语言:javascript
复制
fn children_iter<'a>(&'a self) -> impl 'a + Iterator<Item=NodeIterator>

这将失败,因为它返回当前函数所拥有的数据。

  1. ,也许我可以让self被消耗,这样我们就不需要保留任何引用了?

代码语言:javascript
复制
fn children_iter(self) -> impl Iterator<Item=NodeIterator>

如果self.current的寿命不够长,这就失败了。

  1. 我也尝试过克隆Rc,这样它就不会引用self

中的

代码语言:javascript
复制
self.current
    .clone()
    .borrow()
    ......

这将失败,因为“创建一个临时的,在仍然使用的时候释放它”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-24 02:16:38

弄明白了:

代码语言:javascript
复制
self.current
    .borrow()
    .children()
    .clone()
    .into_iter()
    .map(|n| Self::new(n))

通过这种方式,您可以返回已被转换为迭代器的克隆Vec

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65866494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档