我試圖建立一個懶惰的迭代器,從阻塞隊列拉,並遇到一個奇怪的問題,其中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