8 个版本
0.1.7 | 2023年12月21日 |
---|---|
0.1.6 | 2023年12月20日 |
56 在 #nightly
每月62次 下载
18KB
235 行
⚠ Nightly ⚠
这个 crate 仍然非常实验性,可能无论如何都不是一个好主意!
引用 Rust 参考
"在泛型作用域中定义的静态项(例如在泛型或默认实现中)将导致恰好定义一个静态项,就像将静态定义从当前作用域拉出到模块中一样。不会为单形化定义一个项。"
解决这个问题的方法之一是使用一个 HashMap<TypeId,Data>
。这是一个简单且通常适当的解决方案。如果查找性能很重要,可以跳过对 TypeId
的哈希,以获得一些微小的改进,因为它 已经包含 一个高质量的哈希。这已在 TypeIdMap
中实现。
这个 crate 旨在通过使用内联汇编分配存储来进一步完全消除查找。
支持的目标是 x86-64 和 aarch64。在其他目标上,generic_static
宏将回退到 hashmap,并且大多数其他功能不可用。
此外,不同的编译单元可能访问不同的数据实例!
这个 crate 需要以下不稳定功能:asm_const
以及(在不支持的目标上)const_collections_with_hasher
。
示例
泛型上下文中的静态变量
fn get_and_inc<T>() -> i32 {
generic_static!{
static COUNTER = &AtomicI32::new(1);
}
COUNTER.fetch_add(1, Ordering::Relaxed)
}
assert_eq!(get_and_inc::<bool>(), 1);
assert_eq!(get_and_inc::<bool>(), 2);
assert_eq!(get_and_inc::<String>(), 1);
assert_eq!(get_and_inc::<bool>(), 3);
将数据与类型关联
#[derive(Copy, Clone, Eq, PartialEq)]
struct Metadata(&'static str);
struct Cat;
struct Bomb;
use generic_static_cache::{get, init};
init::<Cat, _>(Metadata("nya!")).unwrap();
init::<Bomb, _>(Metadata("boom!")).unwrap();
assert_eq!(get::<Cat, _>(), Some(Metadata("nya!")));
assert_eq!(get::<Bomb, _>(), Some(Metadata("boom!")));
依赖关系
~135KB