我在我的一个项目中有这个问题,我在操场上成功地复制了这个问题:
struct MyStruct<'a> {
pub vec: Option<&'a mut Vec<u8>>,
}
impl<'a> MyStruct<'a> {
fn some_borrow(&mut self, index: usize) -> Option<&mut u8> {
match &self.vec {
None => println!("nope"),
Some(vec) => match vec.get_mut(index) {
None => println!("no elements"),
Some(int) => return Some(int),
}
}
return None;
}
}
fn main() {
let mut vec = vec![0, 1, 2];
let mut data = MyStruct{ vec: Some(&mut vec) };
data.some_borrow(1);
}error[E0596]: cannot borrow `**vec` as mutable, as it is behind a `&` reference
--> src/main.rs:9:32
|
9 | Some(vec) => match vec.get_mut(index) {
| ^^^^^^^^^^^^^^^^^^ `vec` is a `&` reference, so the data it refers to cannot be borrowed as mutable我不太明白:如果vec是被借用的,为什么我不能借用它的元素呢?
整个项目可以找到这里 (构建该项目将直接导致错误本身,否则会运行良好)。
发布于 2022-08-21 23:00:21
self.vec是不可更改的(match &self.vec),但是您想要更改它(get_mut()),所以您需要不断地借用它:
match &mut self.vec {
None => println!("nope"),
Some(vec) => match vec.get_mut(index) {
None => println!("no elements"),
Some(int) => return Some(int),
}
}发布于 2022-08-21 23:10:21
Vec::get_mut需要应用于&mut self (参见函数的签名)。
这意味着,为了调用该方法,您需要对Vec实例有一个可变的引用。
在你的:
match &self.vec { // <----- here you are taking a &self.vec
None => ..
Some(vec) => ..
}您正在接受对结构的变量成员vec的引用(不可变)。
这意味着表达式的结果给了您对该向量对象的“只读”访问(因此您不能调用更改该向量状态的方法)。
因此:
解决方案1
以&mut self.vec作为匹配表达式:
match &mut self.vec {
None => ..
Some(vec) => ...
}解决方案2
因为self.vec是一个Option,所以对于这些场景有一个方便的方法。
match self.vec.as_mut() {
None => ..
Some(vec) => ..
}https://stackoverflow.com/questions/73438750
复制相似问题