5个不稳定版本
0.3.2 | 2024年5月9日 |
---|---|
0.3.1 | 2024年5月9日 |
0.3.0 | 2024年5月9日 |
0.2.0 | 2024年5月7日 |
0.1.0 | 2024年5月4日 |
在Rust模式中排名第2084
每月下载量60次
11KB
90 行
Zonbi
这是尝试使非静态类型能够进行类型擦除的实验。
工作原理
使用 #[derive(Zonbi)]
,类型将获得一个实现,该实现将所有生命周期替换为给定的一个。手动实现是不安全的,因为用户必须保证 Casted
类型与实现者的类型相同。
这用于 ZonbiId
,它是对 TypeId
的包装,不同之处在于它对非静态类型有额外的行为定义。 ZonbiId
对每种类型都是唯一的,不包括 其生命周期。在底层,它只是使用 Zonbi
特性来获取类型的静态版本并获取其 TypeId
。
例如,要在例如一个box中保持这样的类型擦除值,你可以创建 zonbi Z
的 Cage<'life, Z>
,然后在具有相关最小生命周期的 dyn AnyZonbi<'life>
中保持它。每个至少存活 'life
的 zonbi 都可以向上转换为这个特性,并可以向下转换回它,所有生命周期都是这个最小 'life
。
示例
use zonbi::*;
#[derive(Zonbi)]
struct MyStruct<'a> {
val: &'a NonCopyI32,
}
type_map(&NonCopyI32(42));
fn type_map<'a>(a: &'a NonCopyI32) {
let my_struct = MyStruct { val: a };
let mut type_map: HashMap<ZonbiId, Box<dyn AnyZonbi<'a>>> = HashMap::new();
let id = ZonbiId::of::<MyStruct>();
type_map.insert(id, Box::new(Cage::new(my_struct)));
let r: &MyStruct<'a> = type_map[&id].downcast_ref::<MyStruct<'a>>().unwrap();
assert_eq!(r.val, &NonCopyI32(42));
}
这是 type_map
示例 的分解片段。
许可证
双授权许可,遵循Apache-2.0
和MIT
依赖项
约250-690KB
约16K SLoC