【问题标题】:Is Traversable a trait or a classTraversable 是一个特征还是一个类
【发布时间】:2016-11-29 17:31:20
【问题描述】:

问题 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

val v1 = Iterator(1,2,3)

v1.foreach( println _)

我错过了什么?

【问题讨论】:

    标签: scala iterator traversable


    【解决方案1】:

    问题 1:当您执行 Traversable(1,2,3) 时,实际上是在 Traversable 特征的伴随对象上调用 apply-方法。这个方法实际上用你提供的元素创建了一个ListList 扩展Traversable)。因此,您调用的foreach 方法实际上是Listforeach 方法。

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

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

    【讨论】:

    • 谢谢。有什么理由创建一个伴生对象吗?我看不到使用 Traversable 或 Iterable 对象的场景。
    • 伴随对象通常包含该类的一些创建者。伴随对象总是与类在同一个文件中定义,并且与类同名。您可以在此处查看 Traversable 的伴随对象的 API 文档:scala-lang.org/api/2.12.0/scala/collection/Traversable$.html
    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多