Rust中Scope结构体update方法E0596编译错误修复咨询
问题:Rust中Scope结构体update方法的可变借用错误
我的代码如下:
pub struct Scope<'a> { pub parent: Option<Box<Scope<'a>>>, pub vars: HashMap<&'a str, Value>, } impl<'a> Scope<'a> { pub fn update(&mut self, name: &'a str, v: Value) -> Option<String> { if self.vars.contains_key(name) { self.vars.remove(name); self.vars.insert(name, v); None } else { if let Some(parent) = &self.parent { parent.update(name, v) // 此处报错 } else { Some(format!("{} is undefined", name)) } } } }
编译器给出的错误信息:
error[E0596]: cannot borrow `**parent` as mutable, as it is behind a `&` reference --> src/interpreter/scope.rs:34:17 | 34 | parent.update(name, v) | ^^^^^^^^^^^^^^^^^^^^^^ `parent` is a `&` reference, so the data it refers to cannot be borrowed as mutable
我尝试将let Some(parent) = &self.parent改为let mut Some(parent) = &self.parent,但编译器抛出语法错误,请问该如何修复这个问题?
修复方案
问题核心是你获取的parent是不可变引用,但update方法需要接收&mut self(可变借用)。要解决这个问题,需要对self.parent进行可变借用,而非不可变借用。
修改代码中的else分支即可:
else { if let Some(parent) = &mut self.parent { parent.update(name, v) } else { Some(format!("{} is undefined", name)) } }
关键说明
&mut self.parent会获取parent字段的可变引用,此时parent变量的类型为&mut Box<Scope<'a>>- Rust会自动对
Box进行解引用,将&mut Box<Scope>转换为&mut Scope,刚好满足update方法对可变self的要求
你之前尝试的let mut Some(parent) = &self.parent属于语法错误,因为mut应该用于修饰绑定的变量,而非模式本身。正确的做法是在模式前添加&mut来获取可变引用。
内容的提问来源于stack exchange,提问作者bichanna
相关产品推荐
相关产品推荐

