如何在struct [duplicate]中存储对象及其引用

问题描述 投票:0回答:1

我简化了代码并制作了一个自包含版本,如下所示:

struct TakesRef<'a> {
    string_ref: &'a str,
}

impl<'a> TakesRef<'a> {
    fn new(string_ref: &'a str) -> TakesRef<'a> {
        TakesRef { string_ref }
    }
}

struct Wrapper<'a> {
    string: String,
    obj: TakesRef<'a>,
}

impl<'a> Wrapper<'a> {
    fn new(string: String) -> Wrapper<'a> {
        let obj = TakesRef::new(&string);
        Wrapper { obj, string }
    }
}

我得到的错误是:

error[E0515]: cannot return value referencing function parameter `string`
  --> src/lib.rs:19:9
   |
18 |         let obj = TakesRef::new(&string);
   |                                 ------- `string` is borrowed here
19 |         Wrapper { obj, string }
   |         ^^^^^^^^^^^^^^^^^^^^^^^ returns a value referencing data owned by the current function

error[E0505]: cannot move out of `string` because it is borrowed
  --> src/lib.rs:19:24
   |
16 | impl<'a> Wrapper<'a> {
   |      -- lifetime `'a` defined here
17 |     fn new(string: String) -> Wrapper<'a> {
18 |         let obj = TakesRef::new(&string);
   |                                 ------- borrow of `string` occurs here
19 |         Wrapper { obj, string }
   |         ---------------^^^^^^--
   |         |              |
   |         |              move out of `string` occurs here
   |         returning this value requires that `string` is borrowed for `'a`

我无法改变TakesRef的定义,因为它是一个库类。如何设计Wrapper以便能够存储TakesRef?我尝试使用自己的ref和租赁板条箱......以及RefCell但我仍然无法弄清楚如何编译这段代码。

rust
1个回答
-1
投票

这种自我参照结构是为什么引入std::pin的确切原因。您可能想要从文档中检查this RFCthis example

© www.soinside.com 2019 - 2024. All rights reserved.