看看Traversable和TraversableLike的scaladoc,我很难弄清楚它们之间的区别是什么(除了那个扩展另一个).文档中唯一明显的区别是它表示Traversable是一个"特征"而TraversableLike是一个"模板特征".但谷歌搜索"模板特征"并没有揭示这个术语的定义.救命!
Aar*_*rup 22
我没有在Scala中看到这个通用术语,我认为它特定于Scala集合API的设计.您可以通过阅读Scala集合的架构(尤其是"分解常见操作"一节)[1]和Scala集合SID来了解更多信息.SID的§4.2是相关的,尽管它们在那里被称为"实施特征":
诸如Traversable或Vector之类的集合类从实现特征继承其所有具体方法实现.这些特征以Like suf fi x命名; 例如,VectorLike是Vector的实现特性,TraversableLike是Traversable的实现特性.
简而言之,它们的目的是将实现分开以便在集合层次结构之外使用(例如,StringOps扩展TraversableLike但不是Traversable),并以保留集合类型的方式分解常见操作(请参阅IttayD的答案以获得更详尽的解释).
我应该注意,除非您正在扩展集合层次结构,否则您确实不需要关心这些类.对于普通应用,专注于Traversable,Iterable,Seq,等特点.如果您不熟悉Scala Collections API,我建议您从Scala 2.8 Collection API文档开始,然后根据需要引用scaladoc.你不能期望通过scaladoc看到"大局".
[1]这个链接归功于michid
Itt*_*ayD 22
XXXLike特性在添加Repr泛型参数方面具有重要作用.应该返回相同集合类型的方法(如filter,map,flatMap)在低级特征(TraversableLike)中实现.要对其返回类型进行编码,这些特征会收到它:
trait TraversableLike[+A, +Repr] ...
...
def filter(p: A => Boolean): Repr = {
Run Code Online (Sandbox Code Playgroud)
(对于map和flatMap,问题比较复杂,我不会在这里讨论)
现在说你有一个新类型的集合.你可以这样做:
trait MyCollection[+A] extends TraversableLike[A, MyCollection]
Run Code Online (Sandbox Code Playgroud)
但是如果有人想要扩展你的集合,那么他们就会遇到来自各种继承方法的MyCollection的返回值.
所以相反,你创建:
trait MyCollectionLike[+A, +Repr] extends TraversableLike[A, Repr]
Run Code Online (Sandbox Code Playgroud)
和
trait MyCollection[+A] extends MyCollectionLike[A, MyCollection]
Run Code Online (Sandbox Code Playgroud)
任何想要扩展你的收藏的人都扩展了MyCollectionLike
| 归档时间: |
|
| 查看次数: |
1785 次 |
| 最近记录: |