【问题标题】:Scala collection hierarchyScala 集合层次结构
【发布时间】:2016-04-07 14:21:37
【问题描述】:

我正在查看一张显示 Scala 中集合层次结构的照片。

看起来在层次结构的顶部有 Traversable Trait,再往下是具有 iterator() 函数的 Iterable Trait,再往下是 List 和 Array...

创建一个简单的 List 对象并尝试对其调用 iterator() 会引发错误,指出它不是 List 的一部分。

现在,我知道我可以获取列表的 Iterable 表示形式,然后使用 Iterator 对其进行迭代,但我的问题更多是关于理解这件事的工作原理:List 类不应该获取 iterator() 函数,因为迭代器在同一层次结构中更高?

我是在 Java 开发人员的眼中看待我的问题。

谢谢。

【问题讨论】:

    标签: scala collections


    【解决方案1】:

    List[A],正如你所说,是一个Iterable[A],因此它有一个iterator 方法(不带括号),可以调用该方法来获取列表元素的迭代器:

    val it: Iterator[Int] = List(1, 2, 3).iterator
    

    如果你用括号 iterator() 调用它,它不起作用,因为迭代器方法是在 GenIterableLike trait 中定义的,没有它们:

    trait GenIterableLike[+A, +Repr] extends Any with GenTraversableLike[A, Repr] {
      def iterator: Iterator[A]
    ...
    

    您可以在 scala here 中阅读有关方法调用的信息。 Arity-0 方法可以定义为带或不带括号,但如果你选择后者 (def m = {}),你不能这样称呼它们:m()

    【讨论】:

    • 谢谢。我真的觉得很傻,我确实使用了不带括号的迭代器,但我将列表创建为 Tuple5(在 '(1,2,3,4,5)' 之前没有'List'),这就是我得到'no iterator'的原因' 错误...
    • 这是最好的,相信我。而且我不是其中之一:D
    猜你喜欢
    • 1970-01-01
    • 2019-07-05
    • 2017-01-24
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多