#static #global #lazily #items #evaluated #ctor #non-constant

global-static

延迟评估的非常量静态项

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

Download history 1/week @ 2024-03-14 57/week @ 2024-03-28 44/week @ 2024-04-04

每月下载量 226
j-pls 中使用

MIT/Apache

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 */ }
}

限制

最大的限制是由存储分配内存的类型引起的双重指针间接引用,例如 VecBox。此外,无法存储 DST,因为数据需要从函数返回到堆栈。这可以通过将分配偏移到生成闭包的类型来修复,但是像 Vec 这样的类型,需要额外的信息,仍然无法与该系统一起使用。

依赖项

~110KB