3个版本
0.1.2 | 2024年8月16日 |
---|---|
0.1.1 | 2024年8月16日 |
0.1.0 | 2024年8月16日 |
#561 in 数据结构
每月377次下载
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_ref和downcast_mut在dyn Any
上的类似功能。区别在于
- 下载数据是检查过的,它存储了存储的类型ID,并在检索时检查提供的泛型类型是否匹配。此crate中定义的类型是未检查的,并有一个不安全的先决条件,即类型必须匹配。
- 由于没有存储类型信息,因此
Erased<'a>
只有一个指针宽,是&'a dyn Any
大小的一半 dyn Any
目前只能用于具有静态生命周期的类型。Erased可以用于任何类型。