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.

El BTreeMap Mutex clave no vive el tiempo suficiente.

Estoy desarrollando una función que utiliza un mutex y una key, ambos pasados como argumentos de la función, y este error sigue ocurriendo con cargo check.


error[E0597]: key no vive lo suficiente
--> engine/src/command.rs:21:13
|
20 | fn handle_set<'a>(key: String, value: DataType, storage: Arc<Mutex<BTreeMap<'a str, DataType>>>) -> Response {
| -- tiempo de vida 'a definido aquí
21 | let key = key.as_str();
| ^^^^^^^^^^^^ el valor prestado no vive lo suficiente
22 | storage.lock().unwrap().insert(key, value.clone()).unwrap();
| -------------------------------------------------- el argumento requiere que key sea prestado por 'a
...
25 | }
| - key se suelta aquí mientras todavía está prestado

He intentado cambiar las vidas útiles de todas las funciones principales hasta la función principal sin éxito.

¿Qué estoy haciendo mal aquí?

fn handle_set<'a>(key: String, value: DataType, storage: Arc<Mutex<BTreeMap<'a str, DataType>>>) -> Response {
  let key = key.as_str();
  storage.lock().unwrap().insert(key, value.clone()).unwrap();

  Response::Ok(value)
}

// Ambos DataType y Response son tipos personalizados en mi proyecto

Estoy usando la edición Rust 2021.

¡Gracias de antemano!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según el mensaje de error, parece que el argumento key no vive lo suficiente para su uso en la llamada al método insert(). Esto se debe a que key se convierte en una rebanada de cadena &str utilizando el método as_str() dentro del cuerpo de la función, lo cual crea un préstamo temporal de la cadena String pasada. Este préstamo solo dura hasta el final de la declaración, y como el valor prestado es necesario durante toda la vida útil 'a del argumento storage, el compilador rechaza el código.

    Para solucionar este error, debes cambiar la firma de la función para incluir un parámetro de tiempo de vida 'a que esté vinculado al tiempo de vida del argumento key, de modo que el préstamo de key dure lo suficiente para su uso en la llamada al método insert(). Aquí tienes un ejemplo de código actualizado:

    fn handle_set<'a>(key: &'a str, value: DataType, storage: Arc<><btreemap<&'a str,="" datatype="">>>) -> Response {
      storage.lock().unwrap().insert(key, value.clone()).unwrap();
    
      Response::Ok(value)
    }
    
    // Tanto DataType como Response son tipos personalizados en mi proyecto
    

    En esta versión, el argumento key ahora es una rebanada de cadena &'a str con el mismo parámetro de tiempo de vida 'a que el argumento storage. Esto significa que el préstamo de key dura durante toda la vida útil de 'a, satisfaciendo así los requisitos de la llamada al método insert().

    Ten en cuenta que debido a que se clona el argumento DataType dentro del cuerpo de la función, no necesita un parámetro de tiempo de vida.</btreemap<&’a>

Comments are closed.