使用 show-image crate 时生锈的终身错误
Lifetime error in rust when use show-image crate
谁能说出下面代码中的生命周期错误是什么? (从我的实际代码中简化而来)我自己查看了它,但我无法弄清楚哪里出了问题或如何解决它。
use crate::hello_world_capnp::hello_world;
use capnp_rpc::{rpc_twoparty_capnp, twoparty, RpcSystem};
use futures::AsyncReadExt;
use futures::FutureExt;
use std;
pub async fn main() -> Result<(), Box<dyn std::error::Error>> {
tokio::task::LocalSet::new()
.run_until(async move {
let stream = tokio::net::TcpStream::connect("").await?;
stream.set_nodelay(true)?;
let (reader, writer) =
tokio_util::compat::TokioAsyncReadCompatExt::compat(stream).split();
let rpc_network = Box::new(twoparty::VatNetwork::new(
reader,
writer,
rpc_twoparty_capnp::Side::Client,
Default::default(),
));
let mut rpc_system = RpcSystem::new(rpc_network, None);
let hello_world: hello_world::Client =
rpc_system.bootstrap(rpc_twoparty_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
}
编译错误为
`reply` does not live long enough
borrowed value does not live long enough
我在做一些假设,因为并未给出所有代码。
似乎 img
的类型是 &[u8]
。它借鉴自 reply
。 img
然后在给定 show_image::run_context()
的闭包中使用。问题在于,查看该函数的 the docs 时,它要求闭包具有 'static
生命周期。但是闭包捕获了 img
,它不是 'static
,所以你得到了错误。
一个解决方案是在run_context()
之前复制img
到一个新的vec:
let img = reply
.get()
.unwrap()
.get_reply()
.unwrap()
.get_image()
.unwrap()
.to_vec(); // <--
show_image::run_context(move || {
let image = ImageView::new(ImageInfo::rgb8(800, 533), img); // <--
});
谁能说出下面代码中的生命周期错误是什么? (从我的实际代码中简化而来)我自己查看了它,但我无法弄清楚哪里出了问题或如何解决它。
use crate::hello_world_capnp::hello_world;
use capnp_rpc::{rpc_twoparty_capnp, twoparty, RpcSystem};
use futures::AsyncReadExt;
use futures::FutureExt;
use std;
pub async fn main() -> Result<(), Box<dyn std::error::Error>> {
tokio::task::LocalSet::new()
.run_until(async move {
let stream = tokio::net::TcpStream::connect("").await?;
stream.set_nodelay(true)?;
let (reader, writer) =
tokio_util::compat::TokioAsyncReadCompatExt::compat(stream).split();
let rpc_network = Box::new(twoparty::VatNetwork::new(
reader,
writer,
rpc_twoparty_capnp::Side::Client,
Default::default(),
));
let mut rpc_system = RpcSystem::new(rpc_network, None);
let hello_world: hello_world::Client =
rpc_system.bootstrap(rpc_twoparty_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
}
编译错误为
`reply` does not live long enough
borrowed value does not live long enough
我在做一些假设,因为并未给出所有代码。
似乎 img
的类型是 &[u8]
。它借鉴自 reply
。 img
然后在给定 show_image::run_context()
的闭包中使用。问题在于,查看该函数的 the docs 时,它要求闭包具有 'static
生命周期。但是闭包捕获了 img
,它不是 'static
,所以你得到了错误。
一个解决方案是在run_context()
之前复制img
到一个新的vec:
let img = reply
.get()
.unwrap()
.get_reply()
.unwrap()
.get_image()
.unwrap()
.to_vec(); // <--
show_image::run_context(move || {
let image = ImageView::new(ImageInfo::rgb8(800, 533), img); // <--
});