用途
本技能用于 Rust 中泛型、trait 与零成本抽象的设计与排错。核心问题是:我们需要编译期多态还是运行期多态?在泛型与 trait 对象之间做选择前,应先判断类型是否在编译期已知、是否需要异构集合、性能优先级如何。
主要能力
- 将编译错误转化为设计问题:E0277 不应只说“加 trait 约束”,而应问抽象层级是否正确;E0308 应问类型应统一还是区分;E0599 应问 trait 是否是正确抽象;E0038 应问是否真的需要动态分发。
- 提供抽象选择思路:相同行为、不同类型用 trait;不同行为、同一类型用 enum;无需抽象则用具体类型。类型在编译期已知用泛型(静态分发),运行期确定用 trait 对象(动态分发)。
- 提供分发方式对照:
fn foo<T: Trait>()为静态分发、代码体积增加、运行时零开销;fn foo(x: &dyn Trait)为动态分发、代码体积最小、有 vtable 查找开销;impl Trait返回为静态分发、零运行时开销;Box<dyn Trait>为动态分发、有分配与 vtable 开销。 - 提供语法对比:静态分发可用
impl Display参数、显式泛型T: Display、返回位置impl Display;动态分发可用&dyn Display或Box<dyn Display>。 - 提供错误码速查:E0277 类型未实现 trait,添加 impl 或修改约束;E0308 类型不匹配,检查泛型参数;E0599 找不到方法,用 use 导入 trait;E0038 trait 非对象安全,改用泛型或重新设计。
- 提供决策指南:性能关键选泛型;异构集合选 dyn Trait;插件架构选 dyn Trait;减少编译时间选 dyn Trait;小而已知的类型集合选 enum。
- 说明对象安全条件:不含
Self: Sized约束、不返回Self、不含泛型方法、对非对象安全方法使用where Self: Sized。 - 列出反模式:过度泛化、对已知类型使用 dyn、复杂 trait 层级、忽略对象安全,并给出更优做法。
使用方式
在遇到泛型、trait、impl、dyn、where、单态化、静态分发等相关问题时使用本技能。可先根据错误码定位,再按“错误 → 设计问题”的映射追问抽象层级与类型确定时机,最后参照决策指南与语法对比选择实现方式。
适用场景
- 处理复杂 trait 约束、对象安全报错、类型爆炸。
- 在性能与编译时间之间权衡分发方式。
- 设计插件架构或需要异构集合的接口。
限制
资料未提供具体安装命令、版本要求、平台支持、收费方式或效果数据,这些事实暂未提供。