首页 > 解决方案 > 期望关闭的关闭强制它是“静态的”

问题描述

在这个简单的例子中,我确保DecoderProvider是一个期望引用闭包的函数,所以它期望&Box<dyn Fn(&Option<&Arc<u8>>)>. 这样,它很快就使用了闭包,因此不需要借用闭包'static。但在下面,它看起来像是在呼吁decoder_provider(&provide_decoder);provide_decoder寿命更长fn main,其中包含on_packet_render。为什么?

use std::sync::Arc;
pub type DecoderProvider = Arc<dyn Fn(&Box<dyn Fn(&Option<&Arc<u8>>)>)>;

fn main() {
    let on_packet_render =
        Arc::new(|packet: Option<Box<u8>>| {
            //render packet here
        });
    let decoder = Arc::new(0);
    let decoder_provider:DecoderProvider = Arc::new(
        move |b: &Box<dyn Fn(&Option<&Arc<u8>>)>| {
            b(&Some(&decoder));
        },
    );
    let provide_decoder: Box<dyn Fn(&Option<&Arc<u8>>)> = 
        Box::new(|decoder| {
            on_packet_render(None);
        });
    
    decoder_provider(&provide_decoder);
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0016a84b46a1eaee96e065596ec07243

error[E0597]: `on_packet_render` does not live long enough
  --> src/main.rs:17:13
   |
10 |     let decoder_provider:DecoderProvider = Arc::new(
   |                          --------------- type annotation requires that `on_packet_render` is borrowed for `'static`
...
16 |         Box::new(|decoder| {
   |                  --------- value captured here
17 |             on_packet_render(None);
   |             ^^^^^^^^^^^^^^^^ borrowed value does not live long enough
...
21 | }
   | - `on_packet_render` dropped here while still borrowed

标签: rust

解决方案


默认情况下Arc<dyn Fn(...)>,像 in 这样的 trait 对象。闭包仅通过引用'static使用,因此不是。解决方法是进入闭包:|decoder| { ... }on_packet_render 'static on_packet_render

let provide_decoder: Box<dyn Fn(&Option<&Arc<u8>>)> = 
    Box::new(move |decoder| {
          // ^^^^
        on_packet_render(None);
    });

推荐阅读