#erase #type #arena

erased

通过保留生命周期删除引用或盒子的类型

3个版本

0.1.2 2024年8月16日
0.1.1 2024年8月16日
0.1.0 2024年8月16日

#561 in 数据结构

Download history 239/week @ 2024-08-10 138/week @ 2024-08-17

每月377次下载

MIT 许可证

14KB
140

Erased

通过保留生命周期删除引用或盒子的类型

关于

此crate提供了一种删除引用或盒子的类型的方法,同时保留生命周期。这些删除的引用可以随后不安全地转换回其原始类型。这可以用于在Vec或其他数据结构中存储异构引用。这对于引用到竞技场非常有用。

提供以下类型

类型 描述
Erased<'a> 对值 &'a T 的删除引用
ErasedMut<'a> 对值 &'a mut T 的删除可变引用
ErasedBox 删除盒 Box<T>

示例

use erased::Erased;

let mut vec: Vec<Erased<'_>> = Vec::new();
vec.push((&5u64).into());
vec.push((&"Hello World").into());

// SAFETY: Above we insered a `u64` into an empty vec, therefore converting the element back to a `u64` is sound.
assert_eq!(unsafe { *vec[0].get::<u64>() }, 5);
// SAFETY: Above we insered a `&'static str` into a vec containing one element, therefore converting the element back to a `&'static str` is sound.
assert_eq!(unsafe { *vec[1].get::<&'static str>() }, "Hello World");

dyn Any 的比较

此crate提供了与downcast_refdowncast_mutdyn Any上的类似功能。区别在于

  • 下载数据是检查过的,它存储了存储的类型ID,并在检索时检查提供的泛型类型是否匹配。此crate中定义的类型是未检查的,并有一个不安全的先决条件,即类型必须匹配。
  • 由于没有存储类型信息,因此Erased<'a>只有一个指针宽,是&'a dyn Any大小的一半
  • dyn Any目前只能用于具有静态生命周期的类型。Erased可以用于任何类型。

无运行时依赖