rust - 期望关闭的关闭强制它是“静态的”
问题描述
在这个简单的例子中,我确保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);
}
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
解决方案
默认情况下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);
});
推荐阅读
- node.js - 如何使用 elasticsearch npm 在 nodejs 中实现 elasticsearch 脚本
- python - 无法在 IDLE 上导入 pyperclip
- java - 在 Java 中直接 shuffle iterable
- shell - 以某种格式打印输出文件
- asp.net-core - 在 Asp.net Core 2.2 中设置最大请求 URL 长度
- javascript - 使音频进度条过渡更流畅
- php - Laravel,有没有办法将整个表与数组同步?
- r - 如何使用模型名称和变量列表来计算带有预测的表?
- android - 将 byte[ ] 转换为 String 返回 <���� 在 android bluetooth low energy 上工作
- laravel - 在 Laravel 中创建模型会导致数据库错误