You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust如何返回包裹在结构体中的引用及对应生命周期标注?

问题原因

你遇到的生命周期错误核心是两个问题:

  1. get_borrower方法的返回值Borrower是带两个生命周期参数的泛型结构体,你没有显式标注生命周期参数,Rust无法自动推导对应关系
  2. 没有明确方法接收者&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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:15:01