@tmshit

Как исправить «cannot infer an appropriate lifetime for lifetime parameter»?

Есть упрощенная версия проблемного кода.
При компиляции вылезает
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
  --> src/main.rs:58:18

Удалось это исправить, изменива трейт таким образом.
То есть в объявление трейта был добавлен анонимный лайфтайм
trait Encryptor {
    fn get_file(&self) -> Box<dyn File + '_>;
}
, а в имплементации был добавлен явный лайфтайм:
impl<'a> Encryptor for Crypt<'a> {
    fn get_file(&self) -> Box<dyn File + 'a> {
        Box::new(F::new(self.wk, 11))
    }
}

Вопрос: каким образом, не меняя трейт, решить проблему с определением подходящего лайфтайма в имплементации?
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
@Asapin
В свободное время ковыряюсь с Rust и Wasm
У самого опыта работы с растом не так много, но насколько я понимаю, ситуация получается следующая:
1. Метод fn get_file(&self) возвращает Box
2. Так как у возвращаемого типа Box нет явного ограничения лайфтайма, то согласно RFC 599, ему присваивается лайфтайм 'static
3. Но при этом имплементация трейта File для структуры F ограничена лайфтаймом 'a, отсюда и конфликт.

Возможное решение:
Объект, который должен шериться между другими объектами (в моём примере это WrappedKey) заворачиваем сначала в Box, что бы переместить его из стека в кучу, а затем в Rc, что бы объект не умирал пока на него есть хоть одна ссылка.
Когда надо создать копию ссылки на объект (что бы пошарить этот объект), просто вызываете clone() у Rc.

Если объект надо шарить между разными потоками, то вместо Rcиспользуйте Arc(Atomic RC).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы