看看Traversable和TraversableLike的scaladoc,我很难弄清楚它们之间的区别是什么(除了那个扩展另一个)。文档中唯一明显的区别是它表示Traversable是一个“特征”而TraversableLike是一个“模板特征”。但谷歌搜索“模板特征”并没有揭示这个术语的定义。救命啊!
答案 0 :(得分:22)
我还没有在Scala中看到这个术语,我认为它特定于Scala集合API的设计。您可以通过阅读The Architecture of Scala Collections(尤其是“分解常见操作”部分)[1]和the Scala collections SID来了解更多信息。 SID的§4.2是相关的,尽管它们在那里被称为“实施特征”:
诸如Traversable或Vector之类的集合类从实现特征继承其所有具体方法实现。这些特征以Like suf fi x命名;例如,VectorLike是Vector的实现特性,TraversableLike是Traversable的实现特性。
简而言之,它们的目的是将实现分开以便在集合层次结构之外使用(例如StringOps
扩展TraversableLike
而不是Traversable
)并以这种方式分解常见操作保留集合类型(有关更详细的说明,请参阅IttayD's answer)。
我应该注意,除非您正在扩展集合层次结构,否则您确实不需要关心这些类。对于普通用途,请关注Traversable
,Iterable
,Seq
等特征。如果您不熟悉Scala Collections API,我建议您从Scala 2.8 Collection API document开始,然后根据需要引用scaladoc。你不能期望透过scaladoc看到“大局”。
[1]这个链接归功于michid
答案 1 :(得分: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
答案 2 :(得分:0)
[...] Like类是实际集合类的实现类。从某种意义上说,它们就像模板实现一样,大多数(如果不是全部)行为都是由实际的集合类继承的。
有关非常详细和平易近人的概述,请阅读The Architecture of Scala Collections。