7 个不稳定版本 (3 个破坏性)
| 0.5.0 | 2023 年 1 月 26 日 |
|---|---|
| 0.4.0 | 2023 年 1 月 8 日 |
| 0.3.2 | 2022 年 12 月 27 日 |
| 0.2.1 | 2022 年 11 月 22 日 |
| 0.1.1 |
|
#2669 在 Rust 模式
每月下载 24 次
57KB
509 行
摇曳
摇曳包含类型擦除切片和引用,它们的工作方式类似于 Any,但并非完全如此
&'a T->AnyRef<'a>&'a mut T->AnyMut<'a>&'a [T]->AnySliceRef<'a>&'a mut [T]->AnySliceMut<'a>
这些类型的主要优点是,您可以在不使用泛型代码的情况下处理任何类型的引用和切片。也许更重要的是,它允许您在不使用特质对象的情况下将它们存储在同构容器中(这是我最初编写它的原因)。
这些引用和可变引用中的任何一个都可以通过在引用或切片上调用 ::erase() 来构建。擦除类型仍然受生命周期约束,并且它们还包含一个 TypeId 来检查是否任何未擦除的类型是有效的。内部结构持有原始数据的指针。
您可以使用 AnyRef/Mut 来擦除 [T] 切片,但 AnySliceRef/Mut 保留了原始切片的预期 API 的一部分,例如调用 .len() 或 .is_empty() 并提供对子切片或单个元素的访问。
据我所知,该库是可靠的,并且通过了 cargo miri test,但在个人使用之外,它还未在野外进行测试。我已经与 Rust Zulip 的人进行了交流(感谢 Lokathor, Ben Kimock, Mario Carneiro 和 scottmcm)以涵盖边缘情况。反馈总是受欢迎的。
最后但同样重要的是:别忘了享受您的日子! ;)
示例
let data : [i32; 3] = [0, 1, 2];
// Type-erase a slice
let erased = sashay::AnySliceRef::erase(data.as_slice());
assert_eq!(erased.len(), 3);
// Unerase the whole slice
let unerased = erased.unerase::<i32>().expect("any was not a &[i32]");
assert_eq!(unerased, data.as_slice());
// Unerase just a single element
assert_eq!(erased.get(2).unwrap().unerase::<i32>(), Some(&2));
依赖项
sashay 是 #![no_std] 并且没有依赖项。