小能豆

什么时候适合使用关联类型而不是泛型类型?

rust

引入关联类型的 RFC说:

该 RFC 通过以下方式澄清了特征匹配:

  • 将所有特征类型参数视为输入类型,以及
  • 提供关联类型,即输出类型

RFC 使用图形结构作为激励示例,文档中也使用了这种结构,但我承认我没有完全理解关联类型版本相对于类型参数化版本的优势。最重要的是该distance方法不需要关心Edge类型。这很好,但似乎对于拥有关联类型的原因有点肤浅。

我发现关联类型在实践中使用起来非常直观,但我发现自己在决定何时何地在自己的 API 中使用它们时遇到了困难。

编写代码时,什么时候应该选择关联类型而不是泛型类型参数,什么时候应该选择相反的类型?


阅读 79

收藏
2024-05-21

共1个答案

小能豆

在 Rust 中决定使用关联类型还是泛型类型参数有时可能是一个微妙的决定,并且选择取决于各种因素。以下是一些指导原则,可帮助您决定何时使用每种指导原则:

相关类型:

  1. 更清晰的特征定义:关联类型可以通过分离关注点使特征定义更清晰、更集中。如果特征的实现依赖于特征功能固有的特定类型,但事先不知道,则使用关联类型可以使特征定义更加直观。
  2. 实现灵活性:关联类型在如何构造特征实现方面提供了更大的灵活性。它们允许实现者为每个实现独立地选择关联类型的具体类型,这在某些情况下可能是有益的。
  3. 默认实现:关联类型可以与默认实现结合使用,为特征提供默认行为,允许实现者在需要时覆盖特定的关联类型。

通用类型参数:

  1. 最大灵活性:通用类型参数提供了最大的灵活性,因为它们允许定义特征而无需对具体类型进行任何假设。当特征需要对多种类型进行操作并且事先不知道确切的类型时,这可能很有用。
  2. 特征边界:通用类型参数允许直接在函数签名上指定特征边界,从而提供对可与特征一起使用的类型的更多控制。在某些情况下,这可以导致更清晰、更明确的代码。
  3. Trait 对象兼容性:通用类型参数与 Trait 对象兼容,而关联类型则不然。如果您需要使用特征对象,通用类型参数是最佳选择。

何时选择:

  • 使用关联类型:当特征的功能与实现之间有所不同的特定类型密切相关时,以及当您希望为特征定义提供更清晰的结构时。
  • 使用通用类型参数:当特征需要对多种类型进行操作并且事先不知道确切的类型时,或者当您需要与特征对象兼容时。

在实践中,您可能会发现某些特征可以通过关联类型更自然地表达,而其他特征则受益于泛型类型参数提供的灵活性。它通常取决于 API 的具体要求和设计目标。

2024-05-21