Rust如何返回包裹在结构体中的引用及对应生命周期标注?
问题原因
你遇到的生命周期错误核心是两个问题:
get_borrower方法的返回值Borrower是带两个生命周期参数的泛型结构体,你没有显式标注生命周期参数,Rust无法自动推导对应关系- 没有明确方法接收者
&mut self的生命周期和返回的Borrower持有的引用的生命周期约束关系,Rust的借用检查器无法确认返回的引用不会产生悬垂。
解决方案
你只需要给get_borrower方法补充生命周期标注,明确返回的Borrower的生命周期来源即可,修改后的完整代码如下:
struct C<'a, 'b> { ref2: &'a mut B<'b>, } impl<'a, 'b> C<'a, 'b> { // 新增生命周期'c标记当前self的借用周期,返回的Borrower第一个生命周期绑定'c,第二个复用'b fn get_borrower<'c>(&'c mut self) -> Borrower<'c, 'b> { Borrower { ref3: self.ref2 } } } struct Borrower<'a, 'b> { ref3: &'a mut B<'b>, } impl<'a, 'b> Borrower<'a, 'b> { fn print_and_add(&mut self) { println!("ref is {}", self.ref3.ref1.i); self.ref3.ref1.i += 1; } } struct B<'a> { ref1: &'a mut A, } struct A { i: u32, } fn main() { let mut a = A { i: 10 }; let mut b = B { ref1: &mut a }; let mut c = C { ref2: &mut b }; for _ in 0..10 { let mut borrower = c.get_borrower(); borrower.print_and_add(); } }
标注说明
- 新增的生命周期参数
'c标记了本次方法调用时C实例的可变借用周期 - 返回的
Borrower<'c, 'b>中第一个生命周期'c表示:Borrower持有的B的可变引用是从当前C的实例借出的,存活周期不能超过本次C的借用周期,符合可变引用的独占规则 - 第二个生命周期参数直接复用
C结构体自带的'b,也就是B内部持有的A的引用的生命周期,无需额外约束,因为'b的存活时间本来就长于C实例的生命周期
内容的提问来源于stack exchange,提问作者Aart Stuurman
相关产品推荐
相关产品推荐

