首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从vec的mut引用中借用mut元素?

从vec的mut引用中借用mut元素?
EN

Stack Overflow用户
提问于 2022-08-21 22:51:33
回答 2查看 142关注 0票数 0

我在我的一个项目中有这个问题,我在操场上成功地复制了这个问题:

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
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是被借用的,为什么我不能借用它的元素呢?

链接到操场

整个项目可以找到这里 (构建该项目将直接导致错误本身,否则会运行良好)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-21 23:00:21

self.vec是不可更改的(match &self.vec),但是您想要更改它(get_mut()),所以您需要不断地借用它:

代码语言:javascript
复制
match &mut self.vec {
    None => println!("nope"),
    Some(vec) => match vec.get_mut(index) {
        None => println!("no elements"),
        Some(int) => return Some(int),
    }
}
票数 1
EN

Stack Overflow用户

发布于 2022-08-21 23:10:21

Vec::get_mut需要应用于&mut self (参见函数的签名)。

这意味着,为了调用该方法,您需要对Vec实例有一个可变的引用。

在你的:

代码语言:javascript
复制
match &self.vec { // <----- here you are taking a &self.vec
    None => ..
    Some(vec) => ..
}

您正在接受对结构的变量成员vec的引用(不可变)。

这意味着表达式的结果给了您对该向量对象的“只读”访问(因此您不能调用更改该向量状态的方法)。

因此:

解决方案1

&mut self.vec作为匹配表达式:

代码语言:javascript
复制
match &mut self.vec {
    None => ..
    Some(vec) => ...
}

操场现场

解决方案2

因为self.vec是一个Option,所以对于这些场景有一个方便的方法。

Option::as_mut

代码语言:javascript
复制
match self.vec.as_mut() {
  None => ..
  Some(vec) => ..
}

操场现场

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73438750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档