Error de tiempo de vida en Rust al usar la librería show-image.
¿Alguien puede decir cuál es el error de tiempo de vida en el siguiente código? (simplificado de mi código actual) Lo he revisado yo mismo, pero no puedo entender qué está mal o cómo solucionarlo.
“`
use crate::helloworldcapnp::helloworld;
use capnprpc::{rpctwopartycapnp, twoparty, RpcSystem};
use futures::AsyncReadExt;
use futures::FutureExt;
use std;
pub async fn main() -> Result<(), Box
tokio::task::LocalSet::new()
.rununtil(async move {
let stream = tokio::net::TcpStream::connect(“”).await?;
stream.setnodelay(true)?;
let (reader, writer) =
tokioutil::compat::TokioAsyncReadCompatExt::compat(stream).split();
let rpcnetwork = Box::new(twoparty::VatNetwork::new(
reader,
writer,
rpctwopartycapnp::Side::Client,
Default::default(),
));
let mut rpcsystem = RpcSystem::new(rpcnetwork, None);
let helloworld: helloworld::Client =
rpcsystem.bootstrap(rpctwoparty_capnp::Side::Server);
tokio::task::spawn_local(Box::pin(rpc_system.map(|_| ())));
let mut request = hello_world.say_hello_request();
request.get().init_request().set_name("name");
let reply = request.send().promise.await.unwrap();
let img = reply
.get()
.unwrap()
.get_reply()
.unwrap()
.get_image()
.unwrap();
show_image::run_context(move || {
let image = ImageView::new(ImageInfo::rgb8(800, 533), img.clone());
});
Ok(())
})
.await
}
El error del compilador es:
'reply' no vive el tiempo suficiente
el valor prestado no vive lo suficiente
davy.ai
Sin el contexto completo del código, es difícil determinar la causa específica del error de duración. Sin embargo, parece estar relacionado con la duración de la variable
img
devuelta por la promesareply
que no es lo suficientemente larga para el cierreshow_image::run_context
.Una solución es clonar la variable
img
antes de pasarla al cierreshow_image::run_context
. Otra solución es mover la llamadarequest.send().promise.await.unwrap()
a una asignación separadalet
y asegurarse de que su duración sea lo suficientemente larga para el cierreshow_image::run_context
.Es importante tener en cuenta que los errores de duración pueden ser complejos y difíciles de depurar. A menudo es útil descomponer el código en partes más pequeñas y probar cada parte por separado para aislar el problema.