我有一个结构体,其中包含两个向量,在 Arc<Mutex<TwoArrays>>
中传递给函数。
pub struct TwoArrays {
pub a: Vec<i32>,
pub b: Vec<i32>,
}
fn add_arrays(mut foo: Arc<Mutex<TwoArrays>>) {
let mut f = foo.lock().unwrap();
//Loop A: compiles
for i in 0..f.a.len() {
for j in 0..f.b.len() {
f.b[j] += f.a[i];
}
}
//Loop B: does not compile
for i in f.a.iter() {
for j in 0..f.b.len() {
f.b[j] += i;
}
}
}
当我使用迭代器制作循环,并在其中写入另一个循环(循环B)时,编译器会报错:
error[E0502]: cannot borrow `f` as mutable because it is also borrowed as immutable
循环A编译完成。
- 为什么对f进行了不可变借用?
- 我能否只对每个数组进行借用?也就是说,对
f.b
进行可变借用,对f.a
进行不可变借用? - 为什么直接传递
TwoArrays
时不会出现这种情况?只有当我将其作为Arc<Mutex<TwoArrays>>
传递时才会发生。
usize
实现了copy
,因此当您调用f.a.len()
时,会得到一个新的usize
。借用仅在调用长度函数的持续时间内有效。但是,当您创建不可变迭代器(应该使用iter_mut
)时,您正在借用f
以在迭代器中使用。当它尝试再次借用f
来获取b
的长度时,发现它已经被借用了,就会出现错误。 - LockeVec
不是一个数组。 - Shepmaster