主要观点:人们不常编写更多类型可能是因为中间和专家开发者删除了未成功的模式,本文详细介绍了作者删除的“重复鸭子”类型(MultiError
)及过程,倡导 Rust 开发者记录和分享错误以相互学习。
关键信息:
- “重复鸭子”类型是实现流行类型部分特性且结果相同的类型,如
MultiError
与syn::Error
类似但无额外功能。 - 作者为保证类型总有至少一个错误,分离出第一个错误,实现了
MultiError
结构体及相关函数,如from
、into
等方法。 - 但在测试中发现存在问题,即可能将多个错误合并到单个
syn::Error
中,导致错误计数错误。 - 后来作者发现
syn::Error
已实现所需的所有特性,可将MultiError
替换为syn::Error
,且无需其他逻辑更改。 - 提出“坏鸭子”和“好鸭子”的概念,坏鸭子是可被现有稳定类型替代的类型应删除,好鸭子则可通过添加约束等方式保留。
- 建议在怀疑时记录新类型与原类型的差异,避免重复实现已有类型,并鼓励开发者关注类型及避免“坏类型”模式。
重要细节: MultiError
结构体通过from
方法从VecDeque<syn::Error>
中分离出第一个错误,实现了Into<syn::Error>
和IntoIterator
等 trait。- 在测试中通过
trybuild
发现错误计数与预期不符,最终意识到MultiError
存在问题。 - 作者发送 PR 给
syn
以添加syn::Error::combine
的示例,希望能避免类似错误。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。