14 个版本 (6 个稳定版)
1.0.5 | 2022 年 12 月 21 日 |
---|---|
1.0.4 | 2022 年 7 月 16 日 |
1.0.2 | 2020 年 11 月 13 日 |
1.0.1 | 2019 年 11 月 12 日 |
0.0.4 | 2019 年 3 月 20 日 |
在 Rust 模式 中排名 #265
每月下载量 69
在 8 个 crate 中使用(6 个直接使用)
6KB
70 行
🌍 Globals
Rust 中的无痛苦全局变量。适用于实现 Default 特质的任何类型。
当我刚开始学习 Rust 时,获取一个简单的全局变量竟然如此困难。随着我变得越来越有经验,我厌倦了这些奇怪的宏在我的代码中徘徊。这是一个库,专为喜欢单行全局单例和使用标准 Default 特质实例化的简单性的人设计。这个库默认不使用标准库,因此非常适合需要尽可能少的额外内容的 WebAssembly 和嵌入式开发。享受吧。
根据 Rust 1.63 进行编辑 - 由于静态互斥锁现在得到更广泛的支持,这个库变得不那么必要了,但这个库对于需要懒全局变量仍然很有用。
[dependencies]
globals = "1"
-
#![no_std]
+alloc
- 使您的代码干净利落
示例
struct Foo {
v:u32
}
impl Default for Foo {
fn default() -> Self {
Foo {v:42}
}
}
fn main() {
let f = globals::get::<Foo>();
assert_eq!(f.v,42);
}
这是如何工作的
Rust 是一种重视内存安全的语言。当涉及到全局变量时,这意味着确保对可写入事物的独占访问。保护可能被多个线程交互的全局变量的主要机制是互斥锁。`globals` 有一个存储在互斥锁中的各种类型的单例 HashMap。当你调用 `get()` 时,它会查找你的单例,如果不存在,它会调用 `Default` 特质方法的实现来创建单例实例并将其存储在 hashmap 中。当再次调用 `get()` 时,这个互斥锁包裹的单例会被锁定,并给出一个名为 `MutexGuard` 的处理程序来安全地与这个互斥锁包裹的值交互。你可以像与单例类型交互一样与互斥锁守护程序交互(这就是为什么它看起来像是你在与全局交互)。一旦你的互斥锁守护程序被丢弃,你的互斥锁就会被解锁,以便其他线程可以与你的单例交互。
许可证
该项目受以下任一许可证的许可
- Apache许可证,版本2.0,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义,有意提交给globals
的任何贡献,将如上所述双重许可,不附加任何额外条款或条件。
依赖
约150KB