【问题标题】:How to correctly iterate all records of a multi-level depth structure in Rust?如何正确迭代 Rust 中多级深度结构的所有记录?
【发布时间】:2018-05-27 14:54:57
【问题描述】:

我想知道如何在 Rust 中正确迭代包含在这样排列的数据结构中的所有结果:

struct Node {
    id: i64,
    nodes: Vec<Node>
}

在此结构中插入的记录具有多个级别的深度。比如:

{id: 1, nodes: [
    {id: 2, nodes: [ 
        {id: 3, nodes: []}, 
        {id: 4, nodes: []},
        {id: 5, nodes: [
            {id: 6, nodes: []},
            {id: 7, nodes: [
                {id: 8, nodes: []},
                {id: 9, nodes: []}
            ]}
        ]}
    ]}
]};

【问题讨论】:

  • 您没有表现出任何种尝试解决您自己的问题。 Stack Overflow 不是人们为您编写代码的服务。预计您会表现出一些研究或努力。
  • 但是我对 Rust 了解不多,先生。这就是我寻求帮助的原因。我知道迭代的基本方法是使用 .iter(),但它不会加深结构中的层次。我必须做一个递归函数,但现在类型处理对我来说变得复杂了。
  • 我并没有要求为自己创建代码。我只是问什么是迭代多层次的最佳方式。该人可能只对诸如“使用此系统调用 X,或以 Y 方式结构,或使用 Z 或 W 递归执行”之类的东西做出反应。或者只是在互联网上指向一些文档或示例。
  • 您甚至没有描述“正确”的含义。您可能需要阅读Breadth-first searchDepth-first search
  • “正确”基于语言最佳实践;现在,有了这个链接,你可以帮助我。谢谢。

标签: struct iterator rust


【解决方案1】:

我创建了一个简单的递归函数来处理这个问题,现在一切都很好。我不知道我昨天创建这个主题时犯了什么错误。真正的问题与我所要求的略有不同,但本质是相同的:

use std::vec::Vec;

struct Node {
    id: i64,
    nodes: Vec<Node>,
    focused: bool,
}

struct Controller {
    focused: i32,
}

impl Controller {
    fn get_focused(&mut self) -> i32 {
        let nodes: Node = ....; // code skipped. represented with JSON object above, but with 'focused' member

        for node in nodes.iter() {
            self.focused = self.node_iterator(node);
        }
        self.focused
    }

    fn node_iterator(&self, node: Node) -> i32 {
        let mut focused: i32 = 0;

        if node.nodes.len() > 0 {
            for n in node.nodes.iter() {
                if n.nodes.len() > 0 {
                    focused = self.node_iterator(n);
                    if focused > 0 {
                        return focused;
                    }
                } else {
                    if n.focused == true {
                        focused = n.id as i32;
                        return focused;
                    }
                }
            }
        }
        return 0;
    }
}

fn main() {
    let mut controller = Controller { focused: 0 };

    controller.get_focused();

    println!("{}", controller.focused);
}

【讨论】:

  • 难以置信!这就是我所说的“正确”:) 感谢您的努力。现在我的任务是逐步了解。
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
相关资源
最近更新 更多