如何获取带生命周期约束的结构体字段的可变引用?
问题根因
代码报错的核心原因是get_f1方法的返回值缺少生命周期标注,Rust的自动生命周期推导无法正确识别返回的&mut B携带的生命周期参数,导致方法内部调用时出现生命周期不匹配错误。
你当前的get_f1签名为:
fn get_f1(&mut self) -> &mut B { &mut self.f1 }
这里的B本身携带生命周期参数'a,省略之后编译器会默认给返回的B分配一个和&mut self本次借用绑定的临时生命周期,在execute方法内部调用时,编译器会判定这个临时生命周期的借用无法满足调用set_f1的约束,因此报错。而在main函数中直接调用可正常执行,是因为main中A实例的生命周期参数'a已经被推导为'static(所有字符串字面量默认是'static生命周期),编译器可以自动补全缺省的生命周期约束,因此没有触发报错。
修复方案
仅需要给get_f1方法的返回值补全生命周期参数即可,修改后的签名如下:
fn get_f1(&mut self) -> &mut B<'a> { &mut self.f1 }
修改完成后即可在execute方法中正常调用self.get_f1().set_f1(),满足修改结构体A的f1字段内部值的需求。
写法合理性说明
你选择使用&str而非String的写法符合场景需求,如果存储的都是静态字符串字面量,显式标注生命周期'a的写法符合Rust最佳实践,不需要额外调整。&str做模式匹配时不需要额外解引用,确实比String更便捷,你的使用场景完全适配该写法。
内容的提问来源于stack exchange,提问作者sherlock sampath
相关产品推荐
相关产品推荐

