Почему этот экземпляр TextureCreator <WindowContext>не живет достаточно долго? - PullRequest
0 голосов
/ 12 февраля 2020

Я пишу графическую программу на Rust, используя ящик sdl2 из crates.io.

Я создал эту структуру в main.rs:

struct GameObject {
    name: &'static str,
    pub texture: Option<Texture<'static>>
}

impl GameObject {
    pub fn new(name: &'static str) -> Self {
        Self { name, texture: None }
    }

    pub fn set_texture(&mut self, t: Option<Texture<'static>>) {
        self.texture = t;
    }
}

Я пытаюсь добавить текстуру к экземпляру GameObject со следующими строками кода (где canvas это результат window.into_canvas().build().unwrap() в моем главном окне):

let tc = canvas.texture_creator();
let mut g = GameObject::new("obj");
g.texture = Some(tc.load_texture("image.png").unwrap());

, который вызывает эту ошибку:

error[E0597]: `tc` does not live long enough
  --> src/main.rs:30:22
   |
30 |     g.texture = Some(tc.load_texture("image.png").unwrap());
   |                      ^^---------------------------
   |                      |
   |                      borrowed value does not live long enough
   |                      argument requires that `tc` is borrowed for `'static`

Что это означает в контексте моей программы?

1 Ответ

0 голосов
/ 14 февраля 2020

Добро пожаловать в сообщество переполнения стека.

Код с комментариями

Чтобы понять ошибку, вам необходимо знать, что такое 'static время жизни.

Время жизни 'static - это максимально возможное время жизни, которое длится в течение всего времени жизни работающей программы.
Время жизни 'static также может быть приведено к более короткому времени жизни.

Итак, ваш пример с комментариями:

// create a `tc` vriable with local lifetime 'a
let tc = canvas.texture_creator();

// "obj" has a static lifetime , and g has a local lifetime 'b
let mut g = GameObject::new("obj"); 

// here you try to put a variable with lifetime 'c (returned by load_texture 
// that is probably equal to 'a) into a variable `g.texture` that is declared
// to contain `'static` lifetime 
// lifetime of "image.png" is `'static` on input of `load_texture()` function 
// but could be shorter in implementation.
g.texture = Some(tc.load_texture("image.png").unwrap()); 

Чтобы заставить его работать, вы можете попробовать использовать lazy-stati c для объявления текстуры с 'static продолжительностью жизни.


Попросите машину go объяснить

Если вы видите ошибку компилятора - вы всегда можете попросить машину go объяснить ее с помощью cmd:

cargo --explain E0597

Другое похожие вопросы с ответами:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...