虽然我使用的是实际数据,但我正在使用rust第三方库,其功能大致类似于以下内容:
struct Object();
impl Object {
fn get_wrapper(&self) -> Wrapper {
Wrapper(std::marker::PhantomData)
}
}
struct Wrapper<'a>(std::marker::PhantomData<&'a str>);
实际上,Wrapper
仅在创建它的Object
的有效期内有效。
当我想创建一个包含MyStruct
的结构Wrapper
时,这成为一个问题,因为我需要确保Object
的生存时间与MyStruct
一样长。 。我认为以下代码应该有效:
struct MyStruct<'a>(Wrapper<'a>, Object);
impl<'a> MyStruct<'a> {
fn new() -> MyStruct<'a> {
let o = Object();
let w = o.get_wrapper();
MyStruct(w, o)
}
}
由于Object
由MyStruct
拥有,因此其生存期就是MyStruct
的生存期,即'a
。
但是,这并不能说服借用检查器,后者抱怨从o.get_wrapper()
借用的值仅存在到构造函数的结尾:
error[E0597]: `o` does not live long enough
--> src/main.rs:14:17
|
14 | let w = o.get_wrapper();
| ^ borrowed value does not live long enough
15 | MyStruct(w, o)
16 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the impl at 11:1...
--> src/main.rs:11:1
|
11 | impl<'a> MyStruct<'a> {
| ^^^^^^^^^^^^^^^^^^^^^
Here's the offending code in the playgound.
为什么此内部参考图案不起作用?我可以做些什么使它工作吗?