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
从框里拿出来。这里的问题和公认的答案都比“副本”更清楚。