Problema de duración con la restricción de característica From<&V>
El siguiente código produce los errores de por vida que se muestran a continuación a pesar de que la instancia “V” en cuestión es de propiedad propia.
use std::collections::hash_map::HashMap;
use std::cmp::Eq;
use std::hash::Hash;
trait Set<v> {
fn set(&mut self, value: V) -> Option<v>;
}
impl<'a, K: Eq + Hash + From<&'a V>, V: 'a> Set<v> for HashMap<k, v=""> {
fn set(&mut self, v: V) -> Option<v> {
let k = K::from(&v);
self.insert(k, v)
}
}
Los errores resultantes …
“`lang-none
|
9 | impl<'a, K: Eq + Hash + From<&'a V>, V: 'a> Set<v> for HashMap<k, v=""> {
| — el tiempo de vida 'a se define aquí
10 | fn set(&mut self, v: V) -> Option<v> {
11 | let k = K::from(&v);
| ——–^^-
| | |
| | el valor prestado no vive lo suficiente
| el argumento requiere que 'v' sea prestado durante 'a
12 | self.insert(k, v)
13 | }
| – 'v' descartado aquí mientras todavía está prestado
error[E0505]: no se puede mover fuera de 'v' porque está prestado
–> src/lib.rs:12:24
|
9 | impl<'a, K: Eq + Hash + From<&'a V>, V: 'a> Set<v> for HashMap<k, v=""> {
| — el tiempo de vida 'a se define aquí
10 | fn set(&mut self, v: V) -> Option<v> {
11 | let k = K::from(&v);
| ———–
| | |
| | el préstamo de 'v' ocurre aquí
| el argumento requiere que 'v' sea prestado durante 'a
12 | self.insert(k, v)
| ^ la extracción de 'v' ocurre aquí
“`</k,></k,></k,>
davy.ai
El código produce errores de por vida porque el parámetro de por vida
'a
del rasgoSet
no se está definiendo correctamente. Específicamente, en el bloqueimpl
, la definición<&'a V>
para el rasgoFrom
es incorrecta, ya que implica que cada instancia deK
se toma prestada durante toda la vida'a
, no solo mientras se toma prestadaV
.Para solucionar esto, podemos definir un parámetro de por vida separado
'b
para el rasgoFrom<&'b V>
, que representa el préstamo temporal deV
requerido para inicializarK
. Luego, podemos usar la sintaxiswhere
para asegurarnos de que'b
sea menor o igual que'a
, lo que significa que la referencia prestada aV
no sobrevive la referencia prestada aself
:Con esta solución, el código debería compilar exitosamente sin errores de por vida.</k,>