Здравствуйте.
Есть вот такой код:
...
impl<'a, M> Parser<'a> for ElementsSet<'a, M>
where
M: Fn(&'a str) -> String,
{
fn parse(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {
let res = self.parser.parse(in_string);
return if let Ok(r) = res.0 {
(Ok((self.mapper)(&r)), res.1)
} else {
res
};
}
}
...
impl<'a> Parser<'a> for ElementAny {
fn parse(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {
let mut parser = And::new();
parser.add_parser(BoxedParser::new(ElementOpen::new()));
parser.add_parser(BoxedParser::new(ZeroOrMore::new(ElementsSet::new(
|parsed: &str| {
let ident = " ".repeat(self.level * 4);
ident
},
self.level + 1,
))));
parser.add_parser(BoxedParser::new(ElementClose::new()));
return parser.parse(in_string);
}
}
Компилятор ругается так:
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
--> src/xml_formater.rs:453:13
|
453 | / |parsed: &str| {
454 | | let ident = " ".repeat(self.level * 4);
455 | | ident
456 | | },
| |_____________^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 448:5...
--> src/xml_formater.rs:448:5
|
448 | / fn parse(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {
449 | | let mut parser = And::new();
450 | |
451 | | parser.add_parser(BoxedParser::new(ElementOpen::new()));
... |
461 | | return parser.parse(in_string);
462 | | }
| |_____^
= note: ...so that the types are compatible:
expected &&xml_formater::ElementAny
found &&xml_formater::ElementAny
note: but, the lifetime must be valid for the lifetime `'a` as defined on the impl at 447:6...
--> src/xml_formater.rs:447:6
|
447 | impl<'a> Parser<'a> for ElementAny {
| ^^
= note: ...so that the expression is assignable:
expected (std::result::Result<std::string::String, ()>, &'a str)
found (std::result::Result<std::string::String, ()>, &str)
Насколько я понимаю, его не удовлетворяет время жизни переменной ident. С одной стороны, оно не должно выходить за пределы метода parse, с другой - должно удовлетворять времени жизни 'a.
А с чего он это взял? ident - вообще независимая переменная, возвращается её не ссылка, а владение. Т.е. вообще никаких нестыковок не вижу. С parsed тоже вроде всё в порядке - это часть самой исходной строки, она существует на всё время работы парсера.
Объясните, что не так?