我有一个变量,用于跟踪由处理程序闭包更新的状态。类似于以下内容:
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
寿命足够长。
我该怎么做?