rust - 存储一个静态闭包指针以供不同线程访问
问题描述
我无法将函数或闭包存储在全局静态变量中以供多个函数访问。在我的代码片段中,我创建了一个静态变量 CALLBACK,它保存了对闭包的引用。闭包应该可以访问主函数中的局部变量。
type Callback<'a> = &'a mut dyn FnMut();
static mut CALLBACK: Option<Callback> = None;
fn main() {
let s = "Hello World";
let mut listener = || {
println!("{}",s)
};
unsafe {
CALLBACK = Some(&mut listener);
}
// call timer function for testing
timer_interrupt();
}
// method would be called by timer interrupt
fn timer_interrupt() {
unsafe {
CALLBACK.as_mut().map(|f| f());
}
}
我收到两个与生命周期相关的错误:
error[E0597]: `s` does not live long enough
--> src/main.rs:10:19
|
9 | let mut listener = || {
| -- value captured here
10 | println!("{}",s)
| ^ borrowed value does not live long enough
...
14 | CALLBACK = Some(&mut listener);
| ------------- cast requires that `s` is borrowed for `'static`
...
19 | }
| - `s` dropped here while still borrowed
error[E0597]: `listener` does not live long enough
--> src/main.rs:14:21
|
14 | CALLBACK = Some(&mut listener);
| ^^^^^^^^^^^^^
| |
| borrowed value does not live long enough
| cast requires that `listener` is borrowed for `'static`
...
19 | }
| - `listener` dropped here while still borrowed
有没有办法通过声明闭包的生命周期来解决它,或者是否有另一种方法来实现我需要的功能?
可以在这里找到剪断的复制品:https ://replit.com/@lutzer/StaticClosure2#src/main.rs
解决方案
推荐阅读
- sql-server - 为什么我需要手动打开这个 .NET Core 数据库连接,而通常 Dapper 会自动打开它?
- vue.js - 如何在带有 vue.js 的离子电容器中使用 Cordova 插件
- python - 使用 csvdir 将 csv 数据摄取到 zipline 时解析错误
- javascript - 无法读取未定义的属性“路线”
- varnish - Varnish 添加带有服务器 IP 的 HTTP 标头
- ios - 是否可以从应用商店下载构建版本?
- canvas - 哪些是访问图像像素数据的不同方式并且可以替换该数据?
- android - 如何在 OpenGL ES 和 Vulkan 之间传递纹理?
- r - How to sample cell from one of two columns?
- python - 如何在python中将一列秒添加到一列时间?