下面第一段代碼的目的是爲迭代器定義一個新的特徵,它提供了一個額外的方法,用於在迭代器前面添加一個新的元素。獲得正確的迭代器
但是,在第二個代碼段中運行代碼時,我們看到+:
方法返回一個可迭代的結果,產生0
的無窮大。
我在做什麼錯,我如何得到預期的行爲?
注:我添加了outer
val以確保在定義由+:
返回的對象的方法時獲得正確的迭代器;我不知道如何訪問該迭代器,否則(Iterable2.this.iterator
未編譯)。
trait Iterable2[A] extends Iterable[A] {
val outer :Iterable[A] = this
def +:(elem :A) = new Iterable2[A] {
override def iterator: Iterator[A] = new Iterator[A] {
private[this] var virgin = true
override def hasNext: Boolean = virgin || outer.iterator.hasNext
override def next(): A = {
if (virgin) {virgin = false; elem}
else outer.iterator.next()
}
}
}
}
val i = new Iterable2[Int] {
override def iterator: Iterator[Int] = Iterator(1,2,3)
}
for (j <- 0 +: i) {
println(j)
}
投擲猜測在那裏:會不會是重寫迭代作爲DEF意味着它重新計算新的迭代,每次,從而總是加上形式0的新的迭代,1,2,3但總是從0開始? – 2014-11-24 10:53:37
在文體上說明:不需要爲'outer'引入'val',通過將'val outer'行替換爲'outer',也可以(並且可以更優雅地)顯式引用外部對象=>'。 – misberner 2014-11-24 11:18:23
謝謝@misberner!我希望有人會評論如何做到這一點。我發現[this](http://docs.scala-lang.org/tutorials/tour/explicitly-typed-self-references.html)Scala文檔介紹了'outer =>'語法結構,儘管出於不同的目的。也許有更好的參考? – 2014-11-26 09:29:18