如何告知Rust编译器返回的C不持有构造时传入的A引用?
Rust生命周期问题:如何让编译器识别C不持有A的引用
定义的结构体
struct A { // 一些数据 } struct B<'s> { a: &'s mut A, c: C<'s> } impl<'s> B<'s> { fn new(a: &'s mut A, d: &'s D) -> B<'s> { let c = C::new(d); B { a, c } } fn extract_c(self) -> C<'s> { self.c } } // 第三方库提供的智能指针 struct C<'s> { d: &'s D, // 其他字段,不包含对A的引用 } struct D { // 其他数据,完全不引用A(来自第三方库) }
创建与修改函数
fn modify(b: &mut B) { // 修改 b.a 和 b.c } fn construct_c<'s>(a: &'s mut A, d: &'s D) -> C<'s> { let mut b = B::new(a, d); // 在B::new中初始化C modify(&mut b); b.extract_c() }
期望的使用场景(编译报错)
fn main() { let mut a = A::new(); let d = D::new(); let c = construct_c(&mut a, &d); // 首次可变借用`a` println!("{a}"); // 再次借用`a` let result = do_sth_with_c(c); // 转移`c`的所有权 do_sth_with_a(a); // 其他代码... }
问题描述
编译器报错,认为调用do_sth_with_c时a的可变借用仍在生效,但实际上c并没有持有任何对a的引用。如果移除println!("{a}");和do_sth_with_a(a);,代码可以正常编译,但我需要在调用do_sth_with_c之前使用a。
已尝试的解决方法
- 将所有
&mut A替换为Rc<RefCell<A>>,代码可以编译,但不想使用这种内部可变性方案。 - 为
B添加额外的生命周期参数后问题解决:
struct B<'a, 's> { a: &'a mut A, c: C<'s>, } // 所有使用`B`的函数都需要同步更新生命周期标注
提问
有没有其他方法可以让Rust编译器明确知道C不持有a的引用,从而允许在调用construct_c之后安全地创建a的新引用?
内容的提问来源于stack exchange,提问作者miloszwasacz
相关产品推荐
相关产品推荐

