2014-04-08 17 views
6

Nel libro 'Scala per l'Impaziente' l'autore fornisce i seguenti due esempi di 'for-di comprensione':Perché queste dichiarazioni dall'aspetto simile producono oggetti di tipi diversi?

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') 

Tuttavia, egli non ha menzionato il motivo per cui l'uscita è una stringa nel primo caso, e Vector nel secondo. Qualcuno potrebbe spiegare per favore? Grazie.

risposta

10

Il primo esempio è tradotto in qualcosa di simile:

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

e la seconda per

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

StringOps.flatMap restituisce un String, in modo che il primo esempio restituisce un String pure. Range.flatMap restituisce invece IndexedSeq.

Problemi correlati