Rust匹配Option<&mut T>时可变借用与None场景不可变借用冲突问题
问题解决方案
方案1:拆分错误检查和取值逻辑
提前完成错误状态判断,避免先持有可变借用后再访问同实例的其他字段:
impl Foo { fn get_value_or_panic_with_error(&mut self) -> &mut String { // 先进行错误检查,仅发起不可变借用,检查完成后借用自动释放 if !self.bar.error.is_empty() { panic!("{:?}", self.bar.error); } // 无错误时再发起可变借用获取值 self.bar.get_value().unwrap() } }
方案2:修改返回值为Result类型,直接携带错误信息
调整get_value的返回结构,将错误信息和成功引用整合在同一个返回值中,无需二次访问原实例:
impl Bar { fn get_value(&mut self) -> Result<&mut String, &str> { if self.error.len() > 0 { Err(&self.error) } else { Ok(&mut self.value) } } } impl Foo { fn get_value_or_panic_with_error(&mut self) -> &mut String { self.bar.get_value().unwrap_or_else(|err| panic!("{:?}", err)) } }
补充说明
在None分支中手动drop Option无法通过编译,是当前稳定版Rust借用检查器的粒度限制导致的,该场景在下一代借用检查器Polonius中可直接编译通过,无需额外调整代码。
内容的提问来源于stack exchange,提问作者Skeletonxf
相关产品推荐
相关产品推荐

