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!
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étodoinsert()
. Esto se debe a quekey
se convierte en una rebanada de cadena&str
utilizando el métodoas_str()
dentro del cuerpo de la función, lo cual crea un préstamo temporal de la cadenaString
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 argumentostorage
, 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 argumentokey
, de modo que el préstamo dekey
dure lo suficiente para su uso en la llamada al métodoinsert()
. Aquí tienes un ejemplo de código actualizado: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 argumentostorage
. Esto significa que el préstamo dekey
dura durante toda la vida útil de'a
, satisfaciendo así los requisitos de la llamada al métodoinsert()
.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>