Neben der hervorragenden Antwort von Shadowlands möchte ich ein intuitives Beispiel für den Unterschied zwischen filter
und geben withFilter
.
Betrachten wir den folgenden Code
val list = List(1, 2, 3)
var go = true
val result = for(i <- list; if(go)) yield {
go = false
i
}
Die meisten Menschen erwarten result
, gleich zu sein List(1)
. Dies ist seit Scala 2.8 der Fall, weil das Verständnis in übersetzt wird
val result = list withFilter {
case i => go
} map {
case i => {
go = false
i
}
}
Wie Sie sehen können, wandelt die Übersetzung die Bedingung in einen Aufruf von um withFilter
. Vor Scala 2.8 wurde das Verständnis in Folgendes übersetzt:
val r2 = list filter {
case i => go
} map {
case i => {
go = false
i
}
}
Mit wäre filter
der Wert von result
ziemlich unterschiedlich : List(1, 2, 3)
. Die Tatsache, dass wir das go
Flag erstellen, false
hat keine Auswirkung auf den Filter, da der Filter bereits fertig ist. Auch in Scala 2.8 wird dieses Problem mit gelöst withFilter
. Bei withFilter
Verwendung wird die Bedingung jedes Mal ausgewertet, wenn auf ein Element innerhalb einer map
Methode zugegriffen wird.
Referenz : - S.120, Scala in Aktion (Cover Scala 2.10), Manning Publications, Milanjan Raychaudhuri - Oderskys Gedanken zur Übersetzung zum Verständnis