Здравствуйте.
В продолжение моей темы
Вот на такой код
struct BoxedParser {
parser: Box<dyn Parser>,
}
impl BoxedParser {
fn new(p: impl Parser) -> Self {
Self {
parser: Box::new(p),
}
}
}
impl Parser for BoxedParser {
fn parse<'a>(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {
self.parser.parse(in_string)
}
}
rust ругается так
error[E0310]: the parameter type `impl Parser` may not live long enough
--> src/xml_formater.rs:37:21
|
37 | parser: Box::new(p),
| ^^^^^^^^^^^
|
При чём тут время жизни вообще? Я ведь передаю p во владение BoxedParser, а не ссылку!
p у Вас это impl Parser, то есть неявный дженерик. Если бы был явным, то это было бы fn new<P: Parser>(p: P) -> Self. Соответственно, так как p - это любой тип, то он может быть и ссылкой и любым другим reference-типом, который содержит в себе лайфтаймы. А Box<dyn Parser> - это на самом деле сокращенное от Box<dyn Parser + 'static>. Потому и не сходится. Попробуйте fn new(p: impl Parser + 'static) -> Self
Это же вообще, по-моему, не generic. Он может им быть, а может и нет. Для функции это всё равно, лишь бы реализовывался трейт Parser.
Хм… т.е. rust выводит времена жизни только из сигнатур? Реально не проверяется что там в коде конкретного типа, который передаётся в функцию?
Да, так конкретно эта ситуация решается, но дальше по коду другие ошибки. Не помню уже точно, я с десяток вариантов уже перебрал (
Да, весь лайф-тайм чекинг локальный.