3个不稳定版本
0.2.0 | 2020年2月9日 |
---|---|
0.1.1 | 2019年12月25日 |
0.1.0 | 2019年12月25日 |
#248 in #static
21KB
328 行
scoped-callback
允许使用具有局部借用并预期函数具有 'static 生命周期的代码注册作用域函数。
动机示例
/// Function for registering a callback with a `'static` lifetime.
fn register(callback: Box<dyn FnMut(i32)>) -> Box<dyn FnMut(i32)> {
callback
}
/// Function for de-registering the handle returned by `register`,
/// in this case the callback itself.
fn deregister(_callback: Box<dyn FnMut(i32)>) {}
/// Variable that can be borrowed from inside the callback closure
let a = 42;
/// After returning from the closure, `scope` guarantees that any callbacks
/// that have not yet been de-registered are de-registered.
scope(|scope| {
/// Register the given closure, which can borrow from the stack outside `scope`
/// using the `register` and `deregister` functions declared above.
/// The returned handle will cause a de-register when dropped.
let _registered = scope.register(
|_| {
let b = a * a;
println!("{}", b);
},
register,
deregister,
);
});
请参阅 scope_async 和 scope_async_local,了解与 async
作用域一起工作的版本。
这是如何安全的?
该实现中有三个重要概念
- register 返回一个 Registered 实例,当它被 Drop 时,将使用提供的函数取消注册回调。
- 如果 Registered 实例没有被 Drop,例如通过调用
std::mem::forget
(这不是unsafe
!),则取消注册将在离开传递给 scope 的闭包之后发生。 - 如果给定的取消注册函数实际上没有取消注册回调,并且由于某种原因在 scope 传递的闭包之后调用传递给 register 函数的回调,则调用将导致
panic!
。
no_std
此软件包通过禁用其 std
功能支持 no_std
。
许可证:Apache-2.0
依赖项
~170KB