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]
并且没有依赖项。