我有以下最小示例来重现此问题:
fn main() {
let mut vec = Vec::from(["Hello"]);
let mut some_struct = SomeStruct { field: "World" };
some_struct.doSomething(&mut vec);
println!("{:?}", vec);
}
struct SomeStruct<'a> {
field: &'a str
}
impl<'a> SomeStruct<'a> {
fn doSomething(&mut self, vec: &'a mut Vec<&'a str>) {
vec.push(self.field);
}
}
(显然,doSomething
在此示例中不需要对 self 进行可变引用,但我确实需要原始代码中的可变引用)
当我运行上面的示例时,出现以下错误:
error[E0502]: cannot borrow `vec` as immutable because it is also borrowed as mutable
--> src/main.rs:22:22
|
20 | some_struct.doSomething(&mut vec);
| -------- mutable borrow occurs here
21 |
22 | println!("{:?}", vec);
| ^^^
| |
| immutable borrow occurs here
| mutable borrow later used here
|
= note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
doSomething
可变借用后,如何打印出 vec
?
我已经尝试克隆 vec
、RefCell
,但似乎没有任何效果。
最佳答案
问题是 &'a mut Vec<...>
.重复一生通常是错误的。在这种情况下,您告诉 Rust “我想借用 vec
换取 'a
”。但是'a
由 self.field
决定, 并被推断为 'static
在这里(或不;这并不重要。最重要的部分是它被推断为更长/等于 self
的生命周期,因为否则 self
将持有悬空引用)。现在借vec
对于 'a
,您至少在 self
之前阻止使用它被摧毁。
如果删除 'a
生命周期从 vec
, it works :
fn doSomething(&mut self, vec: &mut Vec<&'a str>) {
vec.push(self.field);
}
关于rust - 不能作为不可变借用,因为它也作为可变借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72355536/