单个 Rust 特质的替代平铺实现 | Serhii Potapov(greyblake)

主要观点:

  • Rust 的 trait 系统强大但严格避免歧义,不能有多个可能适用于同一类型的 blanket 实现。
  • blanket 实现是适用于满足某些约束的任何类型的 trait 实现,标准库中的FromInto是经典例子。
  • 但 Rust 禁止两个 blanket 实现重叠,即使理论上可能,如对不同 trait 的 blanket 实现可能会导致歧义。
  • 在 Joydb 项目中遇到此问题,有Adapter等相关 trait,理想情况下用户只需实现一种即可获得Adaptertrait,但 Rust 不允许两个冲突的 blanket 实现。
  • 解决方案是使用标记类型(如Unified<T>Partitioned<T>)、辅助 trait(如BlanketAdapter)和关联类型(如Adapter中的Target)。
  • 示例展示如何实现JsonAdapter,无需代码重复和冲突,只需额外 3 行代码链接。
  • 这种模式利用标记类型和关联类型在遵循 Rust 一致性规则的同时提供了替代 blanket 实现的灵活性。

关键信息:

  • Rust trait 系统的特点及 blanket 实现的定义。
  • Joydb 中的相关 trait 定义及遇到的问题。
  • 解决办法的三个步骤(标记类型、BlanketAdaptertrait、关联类型Target)及示例代码。
  • 提供的相关链接及关于找 Rust 开发者的信息。

重要细节:

  • 标准库中FromInto的实现方式。
  • 在 Joydb 中实现UnifiedAdapterPartitionedAdapter的具体代码。
  • BlanketAdaptertrait 中各个方法的实现细节。
  • Adaptertrait 中关联类型Target的作用及使用方式。
  • 示例中JsonAdapter的实现及与其他 trait 的关联。
阅读 11
0 条评论