我有一个递归类型,它不实现复制

struct Node {
    board: Board,
    children: Option<Vec<Node>>,
}

我有一个这些 node 的向量,我想对每个 node 调用一个方法,然后将它们传递给另一个函数.

fn foo() {
    let mut nodes: Vec<Node> = get_nodes();
    for i in 0..nodes.len() {
        nodes[i].grow();
    }
    pick_node(nodes);
}

这是可行的,但令人沮丧

fn foo() {
    let nodes: Vec<Node> = get_nodes();
    for mut node in nodes{
        node.grow();
    }
    pick_node(nodes);
}

导致错误,因为"由于此隐式调用.into_iter()而移动了options"

有没有一个版本的for..这样我就可以依次引用向量的每个成员,而不需要移动或复制,就像我在第一个版本中使用的范围一样?这是我经常遇到的一个问题,出于某种原因,很难找到答案.正如克利比所说,迭代器可能更快、更清晰,而且看起来很习惯.

推荐答案

我相信你正在寻找的方法是iter和/或iter_mut.因此,您的代码如下所示:

for node in nodes.iter_mut() {
    node.grow();
}

或者,&Vec<T>&mut Vec<T>都有IntoIterator implementations,分别返回iteriter_mut提供的迭代器.因此,以下内容也相当于上述内容:

for node in &mut nodes {
    node.grow();
}

Rust相关问答推荐

rust 蚀将动力特性浇到混凝土 struct 上是行不通的

程序退出后只写入指定管道的数据

如何从Rust记录WASM堆内存使用情况?

包含嵌套 struct 的CSV

使用模块中的所有模块,但不包括特定模块

限制未使用的泛型导致编译错误

无法定义名为&new&的关联函数,该函数的第一个参数不是self

如何迭代属性以判断相等性?

Rust并发读写引起的死锁问题

我可以在 Rust 中 serde struct camel_case 和 deserde PascalCase

push 方法是否取得所有权?

如何在 Rust 的 Hyper 异步闭包中从外部范围正确读取字符串值

打印 `format_args!` 时borrow 时临时值丢失

使用 rust 在 google cloud run (docker) 中访问环境变量的适当方法

为什么 Rust 允许写入不可变的 RwLock?

只有一个字符被读入作为词法分析器的输入

为什么分配对变量的引用使我无法返回它

相交着色器从 SSBO 中读取零

HashMap entry() 方法使borrow 的时间比预期的长

来自外部函数的future 内部可变引用