首页 文章

“特质”和“模板特征”之间有什么区别?

提问于
浏览
21

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

3 回答

  • 22

    我没有特定于Scala集合API的设计 . 您可以通过阅读The Architecture of Scala Collections(尤其是"factoring out common operations"上的部分)[1]和the Scala collections SID来了解更多信息 . SID的§4.2是相关的,尽管它们在那里被称为"implementation traits":

    Traversable或Vector等集合类从实现特征继承所有具体的方法实现 . 这些特征以Like suf fi x命名;例如,VectorLike是Vector的实现特性,TraversableLike是Traversable的实现特性 .

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

    我应该注意,除非您正在扩展集合层次结构,否则您确实不需要关心这些类 . 对于普通用途,请关注 TraversableIterableSeq 等特征 . 如果您是Scala Collections API的新用户,我建议您从Scala 2.8 Collection API document开始,然后根据需要引用scaladoc . 你可以通过scaladoc看大图片 .

    [1]这个链接归功于michid

  • 22

    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

  • 0

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

    有关非常详细和平易近人的概述,请阅读The Architecture of Scala Collections .

相关问题