4 个版本
0.2.0 | 2022年10月12日 |
---|---|
0.2.0-dev.1 | 2021年8月12日 |
0.1.1 | 2021年1月8日 |
0.1.0 | 2020年10月19日 |
#532 在 Rust 模式
68,320 每月下载量
在 151 个crate中使用 (15 个直接使用)
36KB
455 行
Better_Any
为 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:Any
到 Box/&/&mut dyn Tid
的实现。
尽管如此,如果您正在使用 dyn Trait
且 Trait:Tid
,则所有这些都不会工作,您只剩下 Tid
。
安全性
这是安全的,因为创建的特质对象保留生命周期信息,因此我们可以使用适当的生命周期安全地进行下转型。否则,内部它是普通的 Any
。
依赖
~215KB