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

Download history 390/week @ 2024-05-03 110/week @ 2024-05-10 6/week @ 2024-05-17 1/week @ 2024-05-24 1/week @ 2024-06-28 11/week @ 2024-07-05 56/week @ 2024-07-26 4/week @ 2024-08-02

每月下载量60

MIT/Apache

11KB
90

Zonbi

这是尝试使非静态类型能够进行类型擦除的实验。

工作原理

使用 #[derive(Zonbi)],类型将获得一个实现,该实现将所有生命周期替换为给定的一个。手动实现是不安全的,因为用户必须保证 Casted 类型与实现者的类型相同。

这用于 ZonbiId,它是对 TypeId 的包装,不同之处在于它对非静态类型有额外的行为定义。 ZonbiId 对每种类型都是唯一的,不包括 其生命周期。在底层,它只是使用 Zonbi 特性来获取类型的静态版本并获取其 TypeId

例如,要在例如一个box中保持这样的类型擦除值,你可以创建 zonbi ZCage<'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.0MIT

依赖项

约250-690KB
约16K SLoC