在`main`中指定值的静态生命周期,以便回调可以借用

时间:2018-07-07 18:58:48

标签: rust

我有一个变量,用于跟踪由处理程序闭包更新的状态。类似于以下内容:

fn main() {
    let val = 1;
    add_handler(|| val += 1);
    println!("{}", val);
}

add_handler函数在另一个库中声明,并且具有类型

fn add_handler<F>(listener: F) where F: FnMut() + 'static

当我尝试编译它时,出现错误:

error[E0373]: closure may outlive the current function, but it borrows `val`, which is owned by the current function
 --> src/main.rs:3:16
  |
3 |     add_handler(|| val += 1);
  |                    ^^ --- `val` is borrowed here
  |                    |
  |                    may outlive borrowed value `val`
help: to force the closure to take ownership of `val` (and any other referenced variables), use the `move` keyword
  |
3 |     add_handler(move || val += 1);
  |                 ^^^^^^^

因为val是在main中声明的,所以我知道它将在程序的整个长度内都有效,但是编译器显然不知道这一点,因此我无法移动{{1} },因为我以后需要使用它。

这类似于"error: closure may outlive the current function" but it will not outlive it,但是在val的定义中我无法摆脱'static的生存期,因为我无法控制定义。

这不是Closure may outlive the current function的副本,因为我无法将add_handler移到闭包中。

我可以按照How do I create a global, mutable singleton?来使val成为全局原子,但是似乎应该有一种更简洁的惯用方式告诉编译器val寿命足够长。

我该怎么做?

0 个答案:

没有答案