für Comprehensions sind nur Syntax Zucker und sind übersetzt in Aufrufe von map
, flatMap
, withFilter
(auch foreach
, wenn Sie keine Ausbeute verwenden).
for {
i <- 0 to 1
c <- "Hello"
} yield (i + c).toChar
entspricht
(0 to 1).flatMap(i => "Hello".map(c => (i + c).toChar))
Diese Transformatoren in einer Art und Weise definiert sind, dass sie die gleiche Art von Sammlung Rückkehr wurden sie aufgefordert, oder in der Nähe ein, zum Beispiel hier Range
ein Vector
werden in das Ende, wie Sie Range
nicht haben können, das beliebige Zeichen enthält. Ab String
können Sie immer noch String
zurück haben.
Im Allgemeinen kann man sich das folgendermaßen vorstellen: Der Ergebnistyp, der für das Verständnis erstellt wird, ist derselbe wie der Typ des ersten Generators (oder möglichst ähnlich).
Zum Beispiel, wenn Sie Zeichenfolge in eine Set
for {
c <- "Hello".toSet[Char]
i <- 0 to 1
} yield (i + c).toChar
konvertieren Sie eine Set
zurück zu bekommen, und weil es ein Satz ist, wird es keine Duplikate enthalten, so das Ergebnis ist anders. Set(e, f, m, I, l, p, H, o)
Die Art und Weise, wie der Typ bestimmt wird, umfasst das Merkmal CanBuildFrom
. Sie können mehr darüber lesen, wie es funktioniert here
Siehe http://docs.scala-lang.org/tutorials/FAQ/yield.html –
Kurz gesagt, mit For-Comprehensions der Rückgabetyp wird durch die erste Sammlung bestimmt (oder verfahrbar) verwendet. –