2014-04-08 18 views
6

W książce „Scala dla niecierpliwych” autor udostępnia następujące dwa przykłady dla „for-rozumienie”:Dlaczego te podobne wyrażenia wyglądają na różne typy obiektów?

for (c <- "Hello"; i <- 0 to 1) yield (c + i).toChar 
// Yields "HIeflmlmop" 

for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar 
// Yields Vector('H', 'e', 'l', 'l', 'o', 'I', 'f', 'm', 'm', 'p') 

Jednak nie wspomniał dlaczego wyjście jest String w pierwszym przypadku, i wektor w drugim. Czy ktoś mógłby mi wyjaśnić? Dzięki.

Odpowiedz

10

Pierwszym przykładem jest tłumaczony na coś takiego:

"Hello".flatMap(c => (0 to 1).map(i => (c + i).toChar)) 

a druga

(0 to 1).flatMap(i => "Hello".map(c => (c + i).toChar)) 

StringOps.flatMap zwraca String, więc pierwszy przykład zwraca String również. Range.flatMap zamiast tego zwraca wartość IndexedSeq.

Powiązane problemy