首页 > 解决方案 > 存储一个静态闭包指针以供不同线程访问

问题描述

我无法将函数或闭包存储在全局静态变量中以供多个函数访问。在我的代码片段中,我创建了一个静态变量 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

标签: rustembedded

解决方案


推荐阅读