J'écris un programme graphique en Rust en utilisant le crate sdl2 de crates.io.

J'ai créé cette structure dans 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;
    }
}

J'essaie d'ajouter une texture à une instance de GameObject avec les lignes de code suivantes (où canvas est le résultat de window.into_canvas().build().unwrap() sur ma fenêtre principale) :

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

Ce qui provoque cette erreur:

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`

Qu'est-ce que cela signifie dans le contexte de mon programme?

0
alex franczyk 12 févr. 2020 à 23:30

1 réponse

Meilleure réponse

Bienvenue dans la communauté stack-overflow.

Code avec commentaires

Pour comprendre l'erreur, vous devez savoir ce que 'static la durée de vie est.

Une durée de vie 'static est la durée de vie la plus longue possible et dure toute la durée de vie du programme en cours d'exécution.
Une durée de vie 'static peut également être contrainte à une durée de vie plus courte.

Donc ton exemple avec des commentaires :

// 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()); 

Pour que cela fonctionne, vous pouvez essayer d'utiliser lazy-static pour déclarer Texture avec 'static durée de vie.


Demander à la cargaison d'expliquer

Si vous voyez une erreur du compilateur, vous pouvez toujours demander à cargo de vous l'expliquer avec cmd :

cargo --explain E0597

Autres questions similaires avec réponses :

0
S.R 14 févr. 2020 à 00:16