【问题标题】:what is the difference between a "trait" and a "template trait"?“特征”和“模板特征”有什么区别?
【发布时间】:2011-06-03 18:01:27
【问题描述】:

查看 Traversable 和 TraversableLike 的 scaladoc,我很难弄清楚它们之间的区别是什么(除了一个扩展另一个)。文档中唯一明显的区别是它说 Traversable 是一个“特征”,而 TraversableLike 是一个“模板特征”。但是谷歌搜索“模板特征”并没有揭示这个术语的定义。救命!

【问题讨论】:

    标签: scala


    【解决方案1】:

    我没有看到这个术语在 Scala 中普遍使用,我认为它是特定于 Scala 集合 API 的设计的。您可以通过阅读The Architecture of Scala Collections(尤其是“分解常见操作”部分)[1] 和the Scala collections SID 了解更多信息。 SID 的§4.2 是相关的,尽管它们在那里被称为“实现特征”:

    诸如 Traversable 或 Vector 之类的集合类从实现特征继承其所有具体方法实现。这些特征以 Like 后缀命名;例如 VectorLike 是 Vector 的实现特征, TraversableLike 是 Traversable 的实现特征。

    简而言之,它们的目的是分离实现以供在集合层次结构之外使用(例如 StringOps 扩展 TraversableLike 但不是 Traversable)并以保留集合类型的方式分解常见操作(更详尽的解释请参见IttayD's answer)。

    我应该注意,除非您扩展集合层次结构,否则您实际上不需要关心这些类。对于普通使用,关注TraversableIterableSeq等特征。如果您是 Scala Collections API 的新手,我建议您从 Scala 2.8 Collection API document 开始,然后根据需要引用 scaladoc。您不能期望通过 scaladoc 获得“全局”。

    [1] 此链接归功于 michid

    【讨论】:

    • 感谢您的出色回答!然而,最后一句话让我有点难过:“你不能指望通过 scaladoc 得到‘大图’”——多么不幸……我确实觉得在 Java 标准库的情况下(至少对于自 1.1 以来一直存在的“核心”包 java.lang、java.util 等),我可以通过查看 javadoc 来了解全局。
    【解决方案2】:

    [...]Like 类是实际集合类的实现类。从某种意义上说,它们就像模板实现一样,大多数(如果不是全部)行为都由实际的集合类继承。

    有关非常详细且易于理解的概述,请阅读The Architecture of Scala Collections

    【讨论】:

      【解决方案3】:

      XXXLike 特征在添加Repr 泛型参数方面具有重要作用。应该返回相同集合类型的方法,如 filter、map、flatMap,在低级特征 (TraversableLike) 中实现。为了编码它们的返回类型,这些特征接收它:

      trait TraversableLike[+A, +Repr] ...
        ...
        def filter(p: A => Boolean): Repr = {
      

      (map和flatMap的问题比较复杂,这里就不多说了)

      现在假设你有一个新类型的集合。你可以这样做:

       trait MyCollection[+A] extends TraversableLike[A, MyCollection]
      

      但是,如果有人想扩展您的集合,他们就会被各种继承方法的 MyCollection 返回值所困。

      因此,您创建:

       trait MyCollectionLike[+A, +Repr] extends TraversableLike[A, Repr]
      

       trait MyCollection[+A] extends MyCollectionLike[A, MyCollection]
      

      任何想要扩展您的收藏的人都可以扩展 MyCollectionLike

      【讨论】:

      • IttayD,这应该是 Scala 网站上的 FAQ #1。至少有三种不同的方法可以实现“此方法的返回类型与继承类相同”的技巧——知道哪个用于 Scala 集合库(因此可能是首选机制)是一些事情应该展示更多的 Scala 初学者。
      猜你喜欢
      • 1970-01-01
      • 2017-01-01
      • 2018-05-08
      • 1970-01-01
      • 2017-04-15
      • 2016-04-05
      • 2011-01-10
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多