J'ai eu récemment une erreur qui a été tout simplement résolu en changeantQuelle est la différence entre '& self' et '&' a self '?
impl<'a> Foo<'a> {
fn foo(&'a self, path: &str) -> Boo<'a> { /* */ }
}
à
impl<'a> Foo<'a> {
fn foo(&self, path: &str) -> Boo { /* */ }
}
qui n'a pas de sens selon ma compréhension, je pensais que la deuxième version est exactement le même que le premier avec une élision à vie appliquée.
Dans le cas où nous introduisons une nouvelle vie pour la méthode, cela semble être le cas selon cet exemple de la nomicon.
fn get_mut(&mut self) -> &mut T; // elided
fn get_mut<'a>(&'a mut self) -> &'a mut T; // expanded
Alors, quelles sont les différences entre ceci et mon premier code coupé.
deuxième variante indique au compilateur que '' Boo <'b> devrait vivre aussi longtemps que 'emprunter et 'b self'. C'est quand 'Boo <'b>' n'est plus dans la portée lexicale où il a été pris, 'self' n'est plus emprunté. – red75prime
La première variante lie la durée de vie d'emprunter '& 'un soi' à la durée de vie de la structure' Foo <'a> '. Si 'Foo <'a>' est [invariant] (https://doc.rust-lang.org/nomicon/subtyping.html#variance) sur '' a ', cela signifie que 'self' devrait rester emprunté tant que'' a'. – red75prime
J'ai ajouté un peu d'explication pourquoi la variance de 'Foo' affecte votre code. – red75prime