es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    El código produce errores de por vida porque el parámetro de por vida 'a del rasgo Set no se está definiendo correctamente. Específicamente, en el bloque impl, la definición <&'a V> para el rasgo From es incorrecta, ya que implica que cada instancia de K se toma prestada durante toda la vida 'a, no solo mientras se toma prestada V.

    Para solucionar esto, podemos definir un parámetro de por vida separado 'b para el rasgo From<&'b V>, que representa el préstamo temporal de V requerido para inicializar K. Luego, podemos usar la sintaxis where para asegurarnos de que 'b sea menor o igual que 'a, lo que significa que la referencia prestada a V no sobrevive la referencia prestada a self:

    impl<'a, K, V> Set<v> for HashMap<k, v="">
    where
        K: Eq + Hash + From<&'a V>,
    {
        fn set(&mut self, v: V) -> Option<v> {
            let k = K::from(&v);
            self.insert(k, v)
        }
    }
    

    Con esta solución, el código debería compilar exitosamente sin errores de por vida.</k,>

Comments are closed.