2 votes

Cloner une structure générale à une durée de vie spécifique?

Je joue avec le cookie::Cookie et j'aimerais mettre en place un bocal à cookies plus simple pour mon propre usage.

pub struct NaiveCookieJar<'a> {
    data: HashMap<(String, String), Cookie<'a>,
}

impl<'a> NaiveCookieJar<'a> {
    pub fn add<'b>(&mut self, domain: &str, name: &str, cookie: &'b Cookie<'b>) -> bool {
        let cookie: &'a Cookie = &cookie.clone();  // pas de fonctionnement
        self.data
            .insert((String::from(domain), String::from(name)), *cookie)
            .is_some()
    }
}

Cela a entraîné une erreur: E0495: ne peut pas inférer une durée appropriée pour le paramètre de durée 'c en raison d'exigences conflictuelles

Ce que je veux, c'est que chacun des arguments ne doit vivre que pendant la durée de la méthode elle-même, et je peux faire des copies avec une durée 'a pour les insérer dans la map hash. Donc si j'ai quelque chose comme

fn global_jar() -> &'static Mutex> {
    lazy_static! {
        static ref JAR: Mutex> = Mutex::new(NaiveCookieJar::new());
    }
    &JAR
}

...ou dans tous les cas où le bocal à cookies vit plus longtemps que les arguments, cela ne me piègera pas pour instancier des structs avec la durée correspondante.

Il existe un Cookie::into_owned() -> Cookie<'static> qui correspond à ce cas particulier mais apparemment je ne veux pas que les cookies vivent plus longtemps que le bocal si le bocal n'est pas statique lui-même.

FYI Cookie dérive de Clone mais pas de ToOwned

3voto

Matthieu M. Points 101624

Non.


Il y a un malentendu fondamental ici.

Lorsque Cookie est déclaré avec un paramètre de durée de vie, cela signifie qu'il encapsule une référence à un objet avec cette durée de vie.

Pour cloner le Cookie pour une durée de vie plus longue, vous devriez le démonter, cloner l'objet référencé pour une durée de vie plus longue, puis reconstruire un tout nouveau cookie faisant référence à cet nouvel objet ayant une durée de vie plus longue.

Cependant, ce n'est pas ce que fait clone par défaut1; clone se contente de passer la même référence.

Par conséquent, le seul changement de durée de vie que vous pouvez obtenir en clonant le Cookie est de réduire la durée de vie, pas de l'étendre.

1 Si vous y réfléchissez, qui posséderait le nouvel objet? Certainement pas Cookie, il a juste une référence!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X