1 个不稳定版本
0.1.0 | 2023 年 7 月 4 日 |
---|
#6 在 #contextual
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 的小型实用程序结构体,用于读取和提供您的上下文。