Traversable是特质还是阶级

时间:2016-11-29 17:31:21

标签: scala iterator traversable

问题1 -

在Scala文档中,我发现Traversable是一个带有抽象方法foreach的特征:

http://www.scala-lang.org/docu/files/collections-api/collections.html

那么,为什么我可以实例化Traversable类型的对象?

val t = Traversable(1,2,3)

t.foreach(println _) //where is Scala picking foreach a definition from? 

问题2 - Traversable与List或Array等其他类有何不同?它是否属于Seq,Set或Map类别(我认为其他集合继承自Traversable)

问题3 - 尽管根据文档,Iterable有一个抽象的方法,Iterable

iterator

我错过了什么?

1 个答案:

答案 0 :(得分:5)

问题1:执行Traversable(1,2,3)时,实际上是在apply特征的伴随对象上调用Traversable - 方法。此方法实际上会创建一个List,其中包含您提供的元素(List扩展Traversable)。因此,您调用的foreach方法实际上是foreach的{​​{1}}方法。

问题2:是的,List是Scala集合层次结构顶部的特征。 TraversableList是一些具体集合的实际示例,而Array是许多集合实现的一般特征。

问题3:TraversableIterable不是一回事。你似乎在问题中混淆了它们。 IteratorIterable(1,2,3)完全相同。它会在Traversable(1,2,3)的配套对象上调用apply方法,并为您提供Iterable。但是,List会在Iterator(1,2,3)上调用apply方法,并为您提供一个新的Iterator,它会遍历3个数字。