- Rust的trait系统功能强大但严格避免歧义性,特别是对于泛型实现(blanket implementations)。
- 泛型实现适用于满足特定约束的任何类型(通常通过泛型),例如Rust标准库中的From<T>和Into<U>。
- Rust强制规定:即使理论上存在可能,两个泛型实现也绝不能重叠,以此杜绝歧义。
- 在Joydb中,Adapter trait需要同时支持UnifiedAdapter和PartitionedAdapter两种实现,但Rust的规则禁止直接的泛型实现。
- 解决方案是使用标记结构体(Unified<T>和Partitioned<T>)和辅助trait(BlanketAdapter),在不违反一致性规则的前提下委托行为。
- Adapter trait通过关联类型(Target)指定委托目标——Unified<Self>或Partitioned<Self>。
- 该模式在遵守Rust一致性规则的同时,实现了替代性泛型实现,既提升易用性又避免代码重复。
- 此方案适用于在Rust中为互斥行为提供统一接口的场景。