【发布时间】:2020-01-23 01:59:07
【问题描述】:
Given 是一组以某种方式相互作用的物体。作为一个新手,我用其他语言处理它:
struct Body {
x: i16,
y: i16,
v: i16,
}
fn main() {
let mut bodies = Vec::<Body>::new();
bodies.push(Body { x: 10, y: 10, v: 0 });
bodies.push(Body { x: 20, y: 30, v: 0 });
// keep it simple and loop only twice
for i in 0..2 {
println!("Turn {}", i);
for b_outer in bodies.iter() {
println!("x:{}, y:{}, v:{}", b_outer.x, b_outer.y, b_outer.v);
let mut a = b_outer.v;
for b_inner in bodies.iter() {
// for simplicity I ignore here to continue in case b_outer == b_inner
// just do some calculation
a = a + b_outer.x * b_inner.x;
println!(
" x:{}, y:{}, v:{}, a:{}",
b_inner.x,
b_inner.y,
b_inner.v,
a
);
}
// updating b_outer.v fails
b_outer.v = a;
}
}
}
在内循环完成后更新b_outer.v失败:
error[E0594]: cannot assign to immutable field `b_outer.v`
--> src/main.rs:32:13
|
32 | b_outer.v = a;
| ^^^^^^^^^^^^^ cannot mutably borrow immutable field
使b_outer 可变:
for b_outer in bodies.iter_mut() { ...
也不行:
error[E0502]: cannot borrow `bodies` as mutable because it is also borrowed as immutable
--> src/main.rs:19:32
|
16 | for b_outer in bodies.iter() {
| ------ immutable borrow occurs here
...
19 | for b_inner in bodies.iter_mut() {
| ^^^^^^ mutable borrow occurs here
...
33 | }
| - immutable borrow ends here
现在我被困住了。内循环完成后更新 b_outer.v 的 Rust 方法是什么?
【问题讨论】:
-
在您的情况下,我认为您可以尝试
Vec<Cell<Body>>,因为Cell具有“内在可变性”。 -
注意:我在这里忽略了“显而易见”的答案,创建了
bodies的克隆,并在迭代bodies时修改克隆。它的明显缺点是需要两倍的内存。 -
@MatthieuM。看我的回答 - 我认为在迭代期间就地修改数组对于这个问题是不正确的。
-
@Shepmaster:啊,我没想过挑战逻辑 :)
标签: rust