Rust 拥有一些数据和数据引用的结构

Rust 拥有一些数据和数据引用的结构,rust,object-lifetime,borrow-checker,Rust,Object Lifetime,Borrow Checker,对象的构造会分配该对象生存期所需的数据,但也会创建另一个需要保留对数据引用的对象: pub fn new() -> Obj { let data = compute(); Obj { original: data, processed: AnotherObj { reference: &data } } } 可以用Rust的术语来表达吗 在这里,我希望Obj,AnotherObj和d

对象的构造会分配该对象生存期所需的数据,但也会创建另一个需要保留对数据引用的对象:

pub fn new() -> Obj {
    let data = compute();

    Obj {
        original: data,
        processed: AnotherObj {
            reference: &data
        }
    }
}
可以用Rust的术语来表达吗


在这里,我希望
Obj
AnotherObj
data
具有相同的生命周期,并且当然比
new()
调用更长寿。

基于您的需求的结构的原始设计可能如下所示:

struct AnotherObj{
原文:Vec,//
,因此您必须指定
Obj-Obj{
设data=vec![1,2,3];
Obj{
已处理:另一个{
原件:数据,
// ...
}
}
}
//作为obj.processed.original访问,您甚至可以创建getter`fn original(&self)`
2.共享指针设计 直接使用refcounted指针:

使用std::rc::rc;
另一个对象的pub结构{
原件:Rc,
}
发布结构对象{
原件:Rc,
已处理:另一个OBJ,
}
pub fn new()->Obj{
让data=Rc::new(vec![1,2,3]);
Obj{
原始:data.clone(),
已处理:另一个{
原始:data.clone(),
}
}
}
3.使用原始指针 选项1.和2.将为您带来安全锈神的宁静,因此我不推荐第三个选项。为了完整性,我仍将其发布在这里。注意:它是编译的,但我从未在运行时测试过,因此可能会产生影响。下面只有安全代码,但当您想要取消引用原始p奥特

使用std::ptr;
另一个对象的pub结构{
原件:*mut Vec,
}
发布结构对象{
原件:Vec,
已处理:另一个OBJ,
}
pub fn new()->Obj{
设data=vec![1,2,3];
设mut obj=obj{
原件:数据,
已处理:另一个{
原件:ptr::null_mut(),
}
};
obj.processed.original=&mut obj.original as*mut Vec;
obj
}

raw pointers选项在移动
Obj
时就会崩溃。在代码示例中,就是在从
new
返回
Obj
时。通过优化,
new
可能实际初始化调用方分配的
Obj
,这会让您产生一种错觉,认为它可以工作,但我还没有测试过这个。你必须把
Obj
框起来,给它一个固定的地址,但是生锈不会阻止你把
Obj
从框里拿出来。这里的问题和公认的答案都比“副本”更清楚。