Oprócz doskonałej odpowiedzi Shadowlands , chciałbym przedstawić intuicyjny przykład różnicy między filteri 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 filterwartość resultbyłaby całkiem inna: List(1, 2, 3). Fakt, że tworzymy goflagę, falsenie ma wpływu na filtr, ponieważ filtr jest już gotowy. Ponownie, w Scali 2.8 ten problem został rozwiązany za pomocą withFilter. Gdy withFilterjest używany, warunek jest oceniany za każdym razem, gdy uzyskuje się dostęp do elementu wewnątrz mapmetody.
Referencyjne : - str.120, Scala w działaniu (pokrowce Scala 2.10), Manning Publications, Milanjan Raychaudhuri - myśli Odersky chodzi o do-zrozumienia tłumaczenia