使用 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]。它借鉴自 replyimg 然后在给定 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); // <--
});