【发布时间】:2011-06-03 18:01:27
【问题描述】:
查看 Traversable 和 TraversableLike 的 scaladoc,我很难弄清楚它们之间的区别是什么(除了一个扩展另一个)。文档中唯一明显的区别是它说 Traversable 是一个“特征”,而 TraversableLike 是一个“模板特征”。但是谷歌搜索“模板特征”并没有揭示这个术语的定义。救命!
【问题讨论】:
标签: scala
查看 Traversable 和 TraversableLike 的 scaladoc,我很难弄清楚它们之间的区别是什么(除了一个扩展另一个)。文档中唯一明显的区别是它说 Traversable 是一个“特征”,而 TraversableLike 是一个“模板特征”。但是谷歌搜索“模板特征”并没有揭示这个术语的定义。救命!
【问题讨论】:
标签: scala
我没有看到这个术语在 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)。
我应该注意,除非您扩展集合层次结构,否则您实际上不需要关心这些类。对于普通使用,关注Traversable、Iterable、Seq等特征。如果您是 Scala Collections API 的新手,我建议您从 Scala 2.8 Collection API document 开始,然后根据需要引用 scaladoc。您不能期望通过 scaladoc 获得“全局”。
[1] 此链接归功于 michid
【讨论】:
[...]Like 类是实际集合类的实现类。从某种意义上说,它们就像模板实现一样,大多数(如果不是全部)行为都由实际的集合类继承。
有关非常详细且易于理解的概述,请阅读The Architecture of Scala Collections。
【讨论】:
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
【讨论】: