16 个版本 (4 个重大变更)
0.5.1 | 2024年2月1日 |
---|---|
0.5.0 | 2024年2月1日 |
0.4.4 | 2024年1月28日 |
0.3.1 | 2024年1月28日 |
0.1.0 | 2023年11月11日 |
在 配置 中排名 189
每月下载量 226
在 j-pls 中使用
12KB
183 行
延迟非-const 静态
此crate提供了一个简单的全局分配项,用于将项作为静态项存储,这些项不一定是常量。"全局"这个词有点误导,因为这些更准确地描述为不可变非常量静态项。
Global
解引用为 T
,因此它可以被视为一个包装器,允许任何类型成为静态。
构造函数功能
Global
存储一个函数指针,该指针产生 T
。在第一次解引用调用时,此值将被生成并在堆上分配,其生命周期为整个程序。后续调用将返回此缓存的值。
use global_static::Global;
static MY_NUM: Global<i32> = Global::new(|| 5);
fn main() {
assert_eq!(*MY_NUM + 5, 10);
}
构造函数功能标志
如果您使用 ctor
功能标志,则提供了一个宏,用于在启动时初始化全局。
use global_static::ctor_static;
ctor_static! {
MY_NUM: i32 = { 5 };
MY_OTHER_NUM: i32 = { *MY_NUM * 2 };
};
单例功能
大多数 Global
的用法涉及一个解析后放置在静态中的结构体,如下所示
use global_static::Global;
pub static CONFIG: Global<Config> = Global::new(Default::default);
pub struct Config {
name: String
}
impl Default for Config {
fn default() -> Self { /* implementation */ }
}
singleton
属性为给定的结构体生成一个静态项。
use global_static::singleton;
#[singleton] //generates the CONFIG static
pub struct Config {
name: String
}
impl Default for Config {
fn default() -> Self { /* implementation */ }
}
限制
最大的限制是由存储分配内存的类型引起的双重指针间接引用,例如 Vec
或 Box
。此外,无法存储 DST,因为数据需要从函数返回到堆栈。这可以通过将分配偏移到生成闭包的类型来修复,但是像 Vec
这样的类型,需要额外的信息,仍然无法与该系统一起使用。
依赖项
~110KB