Iterator.continually:无法在Scala REPL中计算表达式
发布时间:2020-12-16 09:55:37 所属栏目:安全 来源:网络整理
导读:有没有人知道/解释为什么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].iteratore
有没有人知道/解释为什么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 此信息由Iterator的toString方法返回,其定义如下: 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循环. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容