#slice #erasure #type #any

摇曳

类型擦除和生命周期擦除引用和切片

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 2022 年 11 月 8 日

#2669Rust 模式

每月下载 24 次

MIT/Apache

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

无运行时依赖