Может ли кто-нибудь сказать, в чем проблема с приведенным ниже кодом? Компилятор жалуется на время жизни, но сообщение об ошибке не имеет абсолютно никакого смысла. Я пробовал все, что мог придумать, но ничего не помогает.Ошибка при запуске в ржавчине с пожизненным ресурсом объекта
use std::borrow::BorrowMut;
trait Trait<'a> {
fn accept(&mut self, &'a u8);
}
struct Impl<'a>{
myref: Option<&'a u8>,
}
impl<'a> Trait<'a> for Impl<'a> {
fn accept(&mut self, inp: &'a u8) { self.myref = Some(inp); }
}
fn new<'a>() -> Box<Trait<'a> + 'a> {
Box::new(Impl{myref: None})
}
fn user<'a>(obj: &mut Trait<'a>) {}
fn parent<'a>(x: &'a u8) {
let mut pool = new();
user(pool.borrow_mut());
}
Ошибка компилятора
error: `pool` does not live long enough
--> src/wtf.rs:22:10
|
22 | user(pool.borrow_mut());
| ^^^^ does not live long enough
23 | }
| - borrowed value dropped before borrower
|
= note: values in a scope are dropped in the opposite order they are created
Который не имеет абсолютно никакого смысла. Как заемщик переживает что-нибудь? Я даже не использую заемную ценность!
Откуда берется ограничение '' b = 'x'? – Antimony
Извините, я случайно скопировал + вставил уже установленную версию примера! Чтобы уточнить, '& 'i mut (Trait <'x> +' x)' (аргумент) унифицирован с символом '& 'b mut (Trait <'a> +' b)' (подпись 'user', до фиксации). Это означает, что '' b' унифицирован * как *, так и '' x'. –
О, это имеет смысл! Я полагаю, что новый, вероятно, должен вернуть что-то вроде Trait <'a> + 'b, но компилятор жаловался, когда у меня не было + a. – Antimony