【发布时间】:2014-01-14 15:48:01
【问题描述】:
我有一个问题,我不知道如何在 Rust 中建模,涉及所有权、生命周期等等。
我有一个大结构:
struct LargeStruct {
x: f32,
n: i32,
// lot of other fields.
}
结构很大,我想避免复制,因此我携带指向它的指针。
我有一个foo 函数,它接受一个指向LargeStruct 的指针和一个f32 值。如果此值大于字段x,我想创建一个将x 设置为此值的新对象,并将其返回。如果它不是更大,那么我想返回原来的指针本身。
我天真地这样实现它:
fn foo(object: &LargeStruct, y: f32) -> &LargeStruct {
if object.x < y {
LargeStruct {
x: y,
n: object.n,
// ...
}
}
else {
object
}
}
但它不起作用:if 的两个分支不返回相同的类型。在第一种情况下,我实际上返回了一个LargeStruct,而在第二种情况下,我返回了一个&LargeStruct。如果我修改对象构造以获取其指针:
&LargeStruct {
那么它也不起作用:构造的对象的生命周期太短,所以我无法从函数中返回它。
如果我尝试在堆上构建对象:
~LargeStruct {
我现在有另一个编译错误:
if 和 else 有不兼容的类型:预期为
~LargeStruct但发现&LargeStruct(应为 &-ptr,但找到 ~-ptr)
我尝试在函数签名中指定生命周期:
fn foo<'a>(object: &'a LargeStruct, y: f32) -> &'a LargeStruct {
但这无济于事:我不知道如何构建具有相同生命周期的新LargeStruct。
我这样调用这个函数:
fn main() {
let object = LargeStruct{
x: 1.0,
n: 2,
// ...
};
let result = foo(&object, 2.0);
}
【问题讨论】: