А с чего он это взял?
C той сигнатуры, которую Вы ему скормили:
fn parse(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {
А именно - в использовании поля self.level. Но всё ещё не могу понять - почему?
Ну, self.level
закреплен за тем же лайтайм-параметром, что и self
(он ведь его часть). Само замыкание у Вас захватывает ссылку на self.level
(это Fn
замыкание), соотвественно является объектом, который ссылается на self.level
, а значит не может пережить self
. При этом это замыкание уезжает в parser
, а результат parser.parse()
должен не пережить некий лайфтайм 'a
, с которым self
у Вас никак не связан.
Вам надо пошаманить над сигнатуркой,
По идее, что-то типа этого должно сработать:
fn parse<'s, 'r: 's + 'a>(&'s self, in_string: &'a str) -> (Result<String, ()>, &'r str) {
Либо же избавиться в замыкании ссылки на self.level
скопировав/склонировав значение и смувнув его в move ||
замыкание, тогда зависимости от self
лайфтайма не будет.