此代碼預期返回true:如何TraversableLike.exists調用我的自定義集合的foreach
class MyList extends Traversable[Int] {
def foreach[U](f: Int => U) = {
f(1)
f(2)
f(3)
}
}
object Test extends App {
println(new MyList().exists(_ == 2))
}
MyList
只需要在爲了實現Traversable
定義foreach
。所以,exists
函數調用MyList.foreach
。設置斷點在f(1)
,我看到foreach
被調用TraversableLike
行352 for (x <- this)
。那麼,是x <- this
呼叫foreach?怎麼樣?我沒有看到任何地方撥打foreach
。
349: def exists(p: A => Boolean): Boolean = {
350: var result = false
351: breakable {
352: for (x <- this)
353: if (p(x)) { result = true; break }
354: }
355: result
366: }
我認爲這是''for'調用'foreach'。 –
是的,編譯器將所有for'comprehensions重寫爲'map','flatMap'和'foreach'(無論哪個都需要)。 – jwvh
請參閱http://stackoverflow.com/questions/9891407/getting-the-desugared-part-of-a-scala-for-comprehension-expression – mfirry