Rust 如何返回引用和被引用对象?

Rust 如何返回引用和被引用对象?,rust,move-semantics,lifetime,borrow-checker,Rust,Move Semantics,Lifetime,Borrow Checker,我有这些(最小的,因此复杂的)结构: 然而: 我如何告诉编译器我实际上在保留这两个结构之间的关系?有什么好办法吗,或者我应该求助于不安全的代码吗?@Jmb其实不是;我已经在使用Pin和Box,因此很少有错误原因仍然存在。另外,这更多地解释了为什么这不可能,而不是如何让它成为可能。等等……也许拥有_ref是一条路?在这种情况下,它将是重复的。被钉住与拥有静态生命周期不同。无论引用是否被固定,都不能只生成具有静态生存期的新引用。此外,您没有通过PinAPI获得对固定值的引用,因此不提供固定保证。您可

我有这些(最小的,因此复杂的)结构:

然而:


我如何告诉编译器我实际上在保留这两个结构之间的关系?有什么好办法吗,或者我应该求助于
不安全的
代码吗?

@Jmb其实不是;我已经在使用
Pin
Box
,因此很少有错误原因仍然存在。另外,这更多地解释了为什么这不可能,而不是如何让它成为可能。等等……也许
拥有_ref
是一条路?在这种情况下,它将是重复的。被钉住与拥有
静态生命周期不同。无论引用是否被固定,都不能只生成具有
静态
生存期的新引用。此外,您没有通过
Pin
API获得对固定值的引用,因此不提供固定保证。您可能需要
Pin.get_mut()
。此外,这从根本上讲是不合理的,因为引用是可变的。如果你被允许做你正在尝试的事情,你可能会得到对同一数据的两个可变引用,这将是一个很好的观点。@PeterHall。我最终确实需要一个对
a
对象的可变引用(因为它需要一个显式析构函数),但直到我删除
B
对象之后才需要。@Jmb不是真的;我已经在使用
Pin
Box
,因此很少有错误原因仍然存在。另外,这更多地解释了为什么这不可能,而不是如何让它成为可能。等等……也许
拥有_ref
是一条路?在这种情况下,它将是重复的。被钉住与拥有
静态生命周期不同。无论引用是否被固定,都不能只生成具有
静态
生存期的新引用。此外,您没有通过
Pin
API获得对固定值的引用,因此不提供固定保证。您可能需要
Pin.get_mut()
。此外,这从根本上讲是不合理的,因为引用是可变的。如果你被允许做你正在尝试的事情,你可能会得到对同一数据的两个可变引用,这将是一个很好的观点。@PeterHall。我最终确实需要一个对
a
对象的可变引用(因为它需要一个显式析构函数),但直到我删除
B
对象之后。
#[derive(Debug)]
struct A(u32);
impl A {
    fn new() -> A{
        A(42)
    }
}

#[derive(Debug)]
struct B<'a>(&'a mut A);
use core::pin::Pin;

struct Thing<'a> {
    pub b: B<'a>,
    a_box: Pin<Box<A>>
}

fn get_thing() -> Thing<'static> {
    let mut a = Pin::new(Box::new(A::new()));
    Thing {
        b: B(&mut a),
        a_box: a
    }
}

fn main() {
    let x = get_thing();
    println!("{:?}", x.b);
}
   Compiling playground v0.0.1 (/playground)
error[E0515]: cannot return value referencing local variable `a`
  --> src/main.rs:22:5
   |
22 | /     Thing {
23 | |         b: B(&mut a),
   | |              ------ `a` is borrowed here
24 | |         a_box: a
25 | |     }
   | |_____^ returns a value referencing data owned by the current function

error[E0505]: cannot move out of `a` because it is borrowed
  --> src/main.rs:24:16
   |
22 | /     Thing {
23 | |         b: B(&mut a),
   | |              ------ borrow of `a` occurs here
24 | |         a_box: a
   | |                ^ move out of `a` occurs here
25 | |     }
   | |_____- returning this value requires that `a` is borrowed for `'static`

error: aborting due to 2 previous errors