Rust遍历结构体指针向量调用可变方法遇E0596错误求助
问题分析与解决:Rust树形结构遍历中的可变引用错误
问题场景
尝试遍历树形结构体中存储的同类型指针向量self.groups,调用可变方法push_group()时触发错误:
error[E0596]: cannot borrow **g as mutable, as it is behind a & reference
即使使用iter_mut()遍历也无法解决该问题。
核心原因
你的结构体定义中,groups字段存储的是不可变引用:
pub groups: Vec<&'a Group<'a>>
哪怕用iter_mut()遍历,得到的是&mut &'a Group<'a>——也就是对这个不可变引用的可变引用,但引用指向的Group实例本身仍然是不可变的,自然无法调用需要&mut self的push_group方法。
解决方案
根据使用场景,有两种常见修复方式:
方式1:使用可变引用存储子节点
将结构体的groups字段改为存储可变引用,同时调整相关方法参数:
pub struct Group<'a> { pub name: String, pub groups: Vec<&'a mut Group<'a>> } impl<'a> Group<'a> { pub fn push_group(&mut self, mut group: &'a mut Group<'a>, parent_name: &str) -> bool { if self.name == parent_name { self.groups.push(group); return true; } for g in self.groups.iter_mut() { let found = g.push_group(group, parent_name); if found { return found; } } false } } fn main() { let mut other_group = Group { name: "OBSERVATION".to_string(), groups: vec![] }; let mut group = Group { name: "PATIENT_RESULT".to_string(), groups: vec![] }; let _ = group.push_group(&mut other_group, "PATIENT_RESULT"); }
方式2:使用所有权管理子节点(更推荐)
如果不需要共享子节点的所有权,直接用Box存储子节点的所有权,避免引用生命周期的麻烦:
pub struct Group { pub name: String, pub groups: Vec<Box<Group>> } impl Group { pub fn push_group(&mut self, group: Box<Group>, parent_name: &str) -> bool { if self.name == parent_name { self.groups.push(group); return true; } for g in self.groups.iter_mut() { let found = g.push_group(group, parent_name); if found { return found; } } false } } fn main() { let mut group = Group { name: "PATIENT_RESULT".to_string(), groups: vec![] }; let other_group = Box::new(Group { name: "OBSERVATION".to_string(), groups: vec![] }); let _ = group.push_group(other_group, "PATIENT_RESULT"); }
若需共享可变访问(比如多个地方需修改同一节点),可结合Rc<RefCell<Group>>实现,但会带来一定运行时开销。
内容的提问来源于stack exchange,提问作者Poulposaure
相关产品推荐
相关产品推荐

