Dieser Code gibt true zurück, wie erwartet:Wie aufrufen TraversableLike.exists meine benutzerdefinierten Sammlungen 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
braucht nur foreach
zu definieren, um eine Traversable
zu implementieren. Also, irgendwo die exists
Funktion ruft MyList.foreach
. Einen Haltepunkt bei f(1)
setzend, sehe ich, dass foreach
durch TraversableLike
Linie 352 for (x <- this)
genannt wird. Also, ist x <- this
Aufruf foreach? Wie? Ich sehe den Anruf an foreach
nirgendwo.
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: }
Es ist 'für' das' foreach' nennt, denke ich. –
Ja, alle "for" -Komprimierungen werden vom Compiler in 'map',' flatMap' und 'foreach' (was immer benötigt wird) umgeschrieben. – jwvh
Siehe http://stackoverflow.com/questions/9891407/getting-the-desugared-part-of-a-scala-for-comprehension-expression – mfirry