#downcast #type-id #any

better_any

非静态类型的类型 ID 和 Any

4 个版本

0.2.0 2022年10月12日
0.2.0-dev.12021年8月12日
0.1.1 2021年1月8日
0.1.0 2020年10月19日

#532Rust 模式

Download history 14809/week @ 2024-03-14 14041/week @ 2024-03-21 14102/week @ 2024-03-28 11592/week @ 2024-04-04 13530/week @ 2024-04-11 13999/week @ 2024-04-18 12527/week @ 2024-04-25 13552/week @ 2024-05-02 16899/week @ 2024-05-09 14859/week @ 2024-05-16 13857/week @ 2024-05-23 13152/week @ 2024-05-30 14954/week @ 2024-06-06 17553/week @ 2024-06-13 19472/week @ 2024-06-20 13831/week @ 2024-06-27

68,320 每月下载量
151 个crate中使用 (15 个直接使用)

MIT/Apache

36KB
455

Better_Any

docs Crate

为 Rust 中缺失 non_static_type_id 功能提供解决方案,并为具有单个生命周期的类型扩展了 Any 特性。

更多信息请参阅 文档

MSRV: 1.41.0-stable

许可证

在您的选择下,许可受 Apache 许可证 2.0 版MIT 许可证 的约束。
除非您明确声明,否则您有意提交以包含在此存储库中的任何贡献,根据 Apache-2.0 许可证定义,应按上述方式双许可,而无需任何额外的条款或条件。

lib.rs:

Better Any

Rust RFC 对于 non_static_type_id 功能已被撤销。这意味着在可预见的未来,在 Rust 中获取非静态类型的类型 ID,更不用说安全地将其向下转换为特定类型,将没有内置的方法。

此 crate 为具有单个生命周期的类型提供了进行这些操作的安全工具。虽然技术上可能将此方法扩展到多个生命周期,但由于需要正确处理生命周期关系,因此创建和使用一致的 API 和 derive 宏将更加困难。如果您确实有需要此功能的多生命周期实际用例,请随时创建一个问题。

此外,它具有更好的向下转换功能,允许您从任何实现 [Tid] 的 trait 对象(如 dyn Any)向下转换,而不仅仅是从 dyn Tid(如 dyn Any)。因此,您不再需要将 fn to_any(self) -> &dyn Any 扩展到您的特质中。

MSRV: 1.41.0-stable(没有夜间功能)

用法

基本上,在您之前使用 dyn Any 的地方,您可以使用 dyn Tid<'a>

  • 如果您的类型是泛型,您应该使用宏 tid!Tid 推导宏为其推导 Tid 实现然后要检索回具体类型,应使用 <dyn Tid>::downcast_* 方法。
  • 如果您的类型不是泛型/实现了 Any,您可以通过任何可用的 From 实现从它创建 dyn Tid。然后要检索回具体类型,应使用 <dyn Tid>::downcast_any_* 方法。
  • 如果您的类型不是泛型且属于您的 crate,您也可以推导 Tid,但此时您需要小心使用与创建特定类型 dyn Tid 方式相对应的方法。否则,下转型将返回 None

如果所有类型都可以实现 Tid 以避免混淆,建议即使某些类型实现了 Any 也使用第一种方法。如果有某些类型实现了 Any 但不能实现 Tid(即来自其他库的类型),建议为所有实现 Any 的类型使用第二种方法,以最大限度地减少混淆。

与 Any 的互操作性

遗憾的是,您不能在所有地方都使用 Tid,因为目前无法为 T:Any 实现 Tid,因为这将与任何其他可能的 Tid 实现冲突。为了克服这一限制,有一个 From 实现可以将从 Box/&/&mut T where T:AnyBox/&/&mut dyn Tid 的实现。

尽管如此,如果您正在使用 dyn TraitTrait:Tid,则所有这些都不会工作,您只剩下 Tid

安全性

这是安全的,因为创建的特质对象保留生命周期信息,因此我们可以使用适当的生命周期安全地进行下转型。否则,内部它是普通的 Any

依赖

~215KB