Время жизни Rust возвращаемого значения должно быть равно времени жизни структуры

#methods #rust #lifetime

#методы #Ржавчина #время жизни

Вопрос:

Предположим, у меня есть такой код:

 struct Struct0 {
   s1: Struct1,
   v: Vec<Box<dyn Tr>>
}

impl Struct0 {
    fn a(amp;mut self) {
        self.v = self.s1.func();
    }
}

struct Struct1 {}

impl<'a> Struct1 {
    fn func(amp;'a self) -> Vec<Box<dyn Tr   'a>> {
        vec![Box::new(Struct2 { some_reference: amp;self } )]
    }
}

trait Tr {
    //...
}

struct Struct2<'a> {
   some_reference: amp;'a Struct1
}

impl Tr for Struct2<'_> {
    //...
}

fn main() {
    
}
  

Это приводит к следующей ошибке:

 error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
 --> src/main.rs:8:26
  |
8 |         self.v = self.s1.func();
  |                          ^^^^
  |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 7:5...
 --> src/main.rs:7:5
  |
7 | /     fn a(amp;mut self) {
8 | |         self.v = self.s1.func();
9 | |     }
  | |_____^
note: ...so that reference does not outlive borrowed content
 --> src/main.rs:8:18
  |
8 |         self.v = self.s1.func();
  |                  ^^^^^^^
  = note: but, the lifetime must be valid for the static lifetime...
note: ...so that the expression is assignable
 --> src/main.rs:8:18
  |
8 |         self.v = self.s1.func();
  |                  ^^^^^^^^^^^^^^
  = note: expected `std::vec::Vec<std::boxed::Box<(dyn Tr   'static)>>`
             found `std::vec::Vec<std::boxed::Box<dyn Tr>>`
  

Я хотел бы сообщить компилятору Rust, что время жизни возвращаемого значения должно равняться времени жизни Struct1. Этот вектор (с его значениями) должен существовать столько же, сколько структура, из которой вызывается этот метод. Как я могу это сказать?

Комментарии:

1. Нет способа выразить это в безопасном Rust, поскольку Rust не поддерживает время жизни с самоссылками.

2. Как я могу заставить это назначение работать тогда?

3. Можете ли вы опубликовать полный код? Я не видел assignment в вашем коде. Кроме того, вы можете использовать unsafe, чтобы пропустить проверку времени жизни rust, но настоятельно не рекомендуется делать это без необходимости. Иногда вам нужно подумать о других способах выражения вашего кода