Oprócz doskonałej odpowiedzi Shadowlands , chciałbym przedstawić intuicyjny przykład różnicy między filter
i withFilter
.
Rozważmy następujący kod
val list = List(1, 2, 3)
var go = true
val result = for(i <- list; if(go)) yield {
go = false
i
}
Większość ludzi oczekuje, result
że będzie im równa List(1)
. Dzieje się tak od wersji Scala 2.8, ponieważ rozumienie tekstu jest tłumaczone na
val result = list withFilter {
case i => go
} map {
case i => {
go = false
i
}
}
Jak widać, tłumaczenie konwertuje warunek na wywołanie withFilter
. Wcześniej Scala 2.8, rozumienie zostało przetłumaczone na coś takiego:
val r2 = list filter {
case i => go
} map {
case i => {
go = false
i
}
}
Korzystanie filter
wartość result
byłaby całkiem inna: List(1, 2, 3)
. Fakt, że tworzymy go
flagę, false
nie ma wpływu na filtr, ponieważ filtr jest już gotowy. Ponownie, w Scali 2.8 ten problem został rozwiązany za pomocą withFilter
. Gdy withFilter
jest używany, warunek jest oceniany za każdym razem, gdy uzyskuje się dostęp do elementu wewnątrz map
metody.
Referencyjne : - str.120, Scala w działaniu (pokrowce Scala 2.10), Manning Publications, Milanjan Raychaudhuri - myśli Odersky chodzi o do-zrozumienia tłumaczenia