mrjbom
@mrjbom

Как раздельно инициализировать структуру?

Я пытаюсь инициализировать структуру в два шага, поскольку поля 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<'_>`
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
vabka
@vabka Куратор тега Rust
Тебе ссылка через & не подойдёт тут.
Используй Arc и Weak.
Либо делай window тоже как ссылку на окно, которое создано в main.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы