Rust:借用检查器可防止返回带有内部引用的结构

时间:2018-09-02 11:40:56

标签: rust lifetime borrow-checker

虽然我使用的是实际数据,但我正在使用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)
    }
}

由于ObjectMyStruct拥有,因此其生存期就是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.

为什么此内部参考图案不起作用?我可以做些什么使它工作吗?

0 个答案:

没有答案