【发布时间】:2021-05-18 19:22:50
【问题描述】:
在 C 中,我可以使用索引以嵌套方式对数组进行可变迭代。在 Rust 中,我几乎可以使用索引来做同样的事情,但是如果我想使用迭代器而不是索引呢?
以下代码示例编译成功,因为两个借用都是不可变的:
let xs = [0, 1, 2];
for x in &xs {
for y in &xs {
println!("x={} y={}", *x, *y);
}
}
但是如果我想使用可变迭代器呢?
let mut xs = [0, 1, 2];
for x in &mut xs {
*x += 1;
for y in &mut xs {
*y += 1;
println!("x={} y={}", *x, *y);
}
}
这会导致:
error[E0499]: cannot borrow `xs` as mutable more than once at a time
我了解对数据进行通道写入访问的必要性,但我也想知道经验丰富的 Rust 用户如何仅使用迭代器来实现这一点——假设索引仅用于教育目的。
【问题讨论】:
-
while let可用于此目的,正如this thread 中指出的那样 -
This article 深入解决了这个问题。
-
没有办法用迭代器做到这一点,因为有时
x和y指向xs中的同一个项目,并被用来改变这个项目。除了使用您排除的索引之外,唯一的解决方法是将xs更改为Cells 的向量以限制可变访问的范围。
标签: loops rust nested iterator borrow-checker