Я пытаюсь инициализировать структуру в два шага, поскольку поля window и app_data не могут быть инициализированы в рамках одной функции, т.к. нельзя вернуть из функции ссылку на локальную переменную. app_data заимствует window. И с виду это работает.
Однако, из-за наличия Drop, компилятор жалуется на то, что вся структура живёт недостаточно долго.
struct Window;
struct Graphics<'window> {
window_ref: &'window Window,
}
impl Drop for Graphics<'_> {
fn drop(&mut self) {
}
}
pub struct App<'app> {
window: Window,
app_data: Option<AppData<'app>>,
}
struct AppData<'graphics> {
graphics: Graphics<'graphics>,
}
impl<'app> App<'app> {
pub fn create_and_preinit() -> Self {
let window = Window;
Self {
window,
app_data: None,
}
}
pub fn init(&'app mut self) {
// Prepare graphics
let graphics = Graphics {
window_ref: &self.window,
};
self.app_data = Some(AppData {
graphics,
});
}
pub fn run(mut self) {}
}
fn main() {
let mut app = App::create_and_preinit();
app.init();
}
Сообщение об ошибкеerror[E0597]: `app` does not live long enough
--> src/main.rs:47:5
|
46 | let mut app = App::create_and_preinit();
| ------- binding `app` declared here
47 | app.init();
| ^^^ borrowed value does not live long enough
48 | }
| -
| |
| `app` dropped here while still borrowed
| borrow might be used here, when `app` is dropped and runs the destructor for type `App<'_>`