我有一个值,我想以我自己的类型存储该值以及对该值内某些内容的引用:
struct Thing { count: u32, } struct Combined<'a>(Thing, &'a u32); fn make_combined<'a>() -> Combined<'a> { let thing = Thing { count: 42 }; Combined(thing, &thing.count) }
有时,我有一个值,我想将该值以及对该值的引用存储在同一结构中:
struct Combined<'a>(Thing, &'a Thing); fn make_combined<'a>() -> Combined<'a> { let thing = Thing::new(); Combined(thing, &thing) }
有时,我什至没有引用该值,但会得到相同的错误:
struct Combined<'a>(Parent, Child<'a>); fn make_combined<'a>() -> Combined<'a> { let parent = Parent::new(); let child = parent.child(); Combined(parent, child) }
在每种情况下,我都会收到一个错误,指出其中一个值“寿命不够长”。这个错误是什么意思?
这个错误提示表明在你的代码中存在生命周期不匹配的问题,也就是生命周期不足以涵盖所有需要引用的对象。具体来说,在 Combined 结构体中,你试图存储一个对象及其引用,但 Rust 编译器无法确定这个引用的生命周期能否长于对象本身。
Combined
让我们逐个分析你的例子:
在 Combined 结构体中,你尝试存储一个 Thing 对象及其引用,这样的话,引用的生命周期必须至少长于 Thing 对象的生命周期。在 make_combined 函数中,你创建了一个 Thing 对象 thing,然后尝试将其引用作为 Combined 结构体的一部分返回。然而,在 make_combined 函数结束后,thing 对象会被销毁,但是 Combined 结构体中的引用仍然存在,这就导致了生命周期不匹配的错误。
Thing
make_combined
thing
在第二种情况下,你尝试存储一个 Thing 对象及其引用,但这次引用是对对象本身的引用,而不是对内部数据的引用。同样地,由于在 make_combined 函数结束后,thing 对象会被销毁,因此在 Combined 结构体中的引用将会指向一个已经销毁的对象,这也是生命周期不匹配的错误。
在第三种情况下,你尝试存储一个 Parent 对象及其 Child 对象的引用。同样的问题也存在于这里,由于在 make_combined 函数结束后,parent 对象会被销毁,但 Combined 结构体中的 Child 引用仍然存在,因此会导致生命周期不匹配的错误。
Parent
Child
parent
要解决这个问题,你需要确保引用的生命周期能够涵盖被引用对象的生命周期,或者使用类似 Rc 或 Arc 这样的引用计数类型来管理对象的生命周期。
Rc
Arc