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