#static #async #memory #no-std #rust

no-std scoped-callback

以安全的方式注册具有局部引用的本地作用域函数到 'static 生命周期回调

3个不稳定版本

0.2.0 2020年2月9日
0.1.1 2019年12月25日
0.1.0 2019年12月25日

#248 in #static

Apache-2.0

21KB
328

Docs

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_asyncscope_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