我试图建立一个懒惰的迭代器,从阻塞队列拉,并遇到一个奇怪的问题,其中next()
似乎被调用超过预期的时间。由于我的队列被阻塞,这会导致我的应用程序在某些情况下卡住。scala - 懒惰的迭代器调用下次太多次?
有些简化的示例代码:
"infinite iterators" should {
def mkIter = new Iterable[Int] {
var i = 0
override def iterator: Iterator[Int] = {
new Iterator[Int] {
override def hasNext: Boolean = true
override def next(): Int = {
i = i + 1
i
}
}
}
override def toString(): String = "lazy"
}
"return subsets - not lazy" in {
val x = mkIter
x.take(2).toList must equal(List(1, 2))
x.take(2).toList must equal(List(3, 4))
}
"return subsets - lazy" in {
val x = mkIter
x.view.take(2).toList must equal(List(1, 2))
x.view.take(2).toList must equal(List(3, 4))
}
}
在上面的例子中,懒惰测试失败,因为第二次调用take(2)
返回List(4, 5)
。
鉴于我看到Scala 2.10和2.11的这种行为,我怀疑这个错误是我的,但我不确定我错过了什么。
那么,你有它。我知道我一定在做错事。谢谢! – 2014-10-06 21:18:03
使用'span',注意它必须在使用后缀后立即缓冲前缀。 – 2014-10-06 22:22:55