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

Download history 21/week @ 2024-03-11 24/week @ 2024-03-18 18/week @ 2024-03-25 67/week @ 2024-04-01 21/week @ 2024-04-08 33/week @ 2024-04-15 22/week @ 2024-04-22 22/week @ 2024-04-29 16/week @ 2024-05-06 14/week @ 2024-05-13 18/week @ 2024-05-20 28/week @ 2024-05-27 18/week @ 2024-06-03 19/week @ 2024-06-10 14/week @ 2024-06-17 15/week @ 2024-06-24

每月下载量 69
8 个 crate 中使用(6 个直接使用)

MIT/Apache 许可证

6KB
70

🌍 Globals

docs.rs docs

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许可证定义,有意提交给globals的任何贡献,将如上所述双重许可,不附加任何额外条款或条件。

依赖

约150KB