gpt4 book ai didi

scala - 迭代器.连续: cannot evaluate expression in Scala REPL

转载 作者:行者123 更新时间:2023-12-02 19:59:45 25 4
gpt4 key购买 nike

有人知道/解释为什么 REPL 在评估最后一个表达式时卡住吗?奇怪的是,它没有抛出任何异常或任何东西,只是什么也没发生。

Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_40).

scala> val empty = Seq.empty[Int].iterator
empty: Iterator[Int] = empty iterator

scala> val emptyInfiniteIterator = Iterator.continually(empty).flatten

预先感谢您的任何解释。

最佳答案

这就是发生的事情。当您在 Scala REPL 中定义迭代器时,会打印有关该迭代器的一些信息,无论它是否为空:

scala> Iterator.continually(List(1)).flatten
res1: Iterator[Int] = non-empty iterator

该信息由IteratortoString方法返回,其定义如下:

override def toString = (if (hasNext) "non-empty" else "empty")+" iterator"

基本上,hasNext 是在新创建的迭代器上调用的。现在让我们看看 hasNext 在您的情况下做了什么 (scala.collection.TraversableOnce.FlattenOps#flatten):

  class FlattenOps[A](travs: TraversableOnce[TraversableOnce[A]]) {
def flatten: Iterator[A] = new AbstractIterator[A] {
val its = travs.toIterator
private var it: Iterator[A] = Iterator.empty
def hasNext: Boolean = it.hasNext || its.hasNext && { it = its.next().toIterator; hasNext }
def next(): A = if (hasNext) it.next() else Iterator.empty.next()
}
}

啊哈! hasNext 递归地遍历迭代器,尝试找到结束元素或单个非空元素。在你的情况下,这永远不会发生,因为你有空元素的无限迭代器。所以,你有一个由 REPL 触发的无限循环。您不会得到 StackOverflow,因为使用了尾递归,并且在 scala 中它被转换为 while 循环。

关于scala - 迭代器.连续: cannot evaluate expression in Scala REPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36818050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com