错误类型模式 - 重复的鸭子

主要观点:人们不常编写更多类型可能是因为中间和专家开发者删除了未成功的模式,本文详细介绍了作者删除的“重复鸭子”类型(MultiError)及过程,倡导 Rust 开发者记录和分享错误以相互学习。
关键信息:

  • “重复鸭子”类型是实现流行类型部分特性且结果相同的类型,如MultiErrorsyn::Error类似但无额外功能。
  • 作者为保证类型总有至少一个错误,分离出第一个错误,实现了MultiError结构体及相关函数,如frominto等方法。
  • 但在测试中发现存在问题,即可能将多个错误合并到单个syn::Error中,导致错误计数错误。
  • 后来作者发现syn::Error已实现所需的所有特性,可将MultiError替换为syn::Error,且无需其他逻辑更改。
  • 提出“坏鸭子”和“好鸭子”的概念,坏鸭子是可被现有稳定类型替代的类型应删除,好鸭子则可通过添加约束等方式保留。
  • 建议在怀疑时记录新类型与原类型的差异,避免重复实现已有类型,并鼓励开发者关注类型及避免“坏类型”模式。
    重要细节:
  • MultiError结构体通过from方法从VecDeque<syn::Error>中分离出第一个错误,实现了Into<syn::Error>IntoIterator等 trait。
  • 在测试中通过trybuild发现错误计数与预期不符,最终意识到MultiError存在问题。
  • 作者发送 PR 给syn以添加syn::Error::combine的示例,希望能避免类似错误。
阅读 26
0 条评论