#bind #contextual #value #macro #thread-local #deeply #threadlocals

deep-bind

一个用于使用 threadlocal 深度绑定上下文值的宏

1 个不稳定版本

0.1.0 2023 年 7 月 4 日

#6#contextual

MIT 许可证

6KB
99

deep-bind

deep-bind 帮助您将一个值绑定到您调用的任何函数,而无需显式通过参数传递。

您可能会使用它来保留配置、请求或操作 ID,或者您希望使用单例但担心全局状态带来的所有问题。

示例

创建一个由 MY_COUNTER 线程局部变量支持的 MyCounter 上下文。

contextual!{
    MyCounter(MY_COUNTER): u32 = 0
}

fn main() {
    println!("{}", MyCounter::clone()); /// -> 0
    MyCounter::replace_within(1, || {
        println!("{}", MyCounter::clone()); /// -> 1

        some_other_function(); // this function can also get `1`
    });
    println!("{}", MyCounter::clone()); /// -> 0
}

工作原理

内部,此包使用 thread_local!{...} 创建一个带有括号中名称的线程局部变量,并用 RefCell 包装。它还创建了一个带有您选择的 UpperCamelCaseName 的小型实用程序结构体,用于读取和提供您的上下文。

无运行时依赖