Задать вопрос
@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))
    }
}

Вопрос: каким образом, не меняя трейт, решить проблему с определением подходящего лайфтайма в имплементации?
  • Вопрос задан
  • 68 просмотров
Подписаться 1 Простой 6 комментариев
Решения вопроса 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).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы