2010-05-29 23 views
8

En el capítulo 3 de Programming Scala, el autor proporciona dos ejemplos de bucles for/para comprensión, pero cambia entre using() y {} 's. ¿Por qué es este el caso, ya que estos intrínsecamente parecen estar haciendo lo mismo? ¿Hay alguna razón por la que breed <- dogBreeds esté en la 2da línea en el ejemplo 2?Comprensión del alcance de los bucles For de Scala (para comprensión)

// #1()'s 
for (breed <- dogBreeds 
    if breed.contains("Terrier"); 
    if !breed.startsWith("Yorkshire") 
) println(breed) 

// #2 {}'s 
for { 
    breed <- dogBreeds 
    upcasedBreed = breed.toUpperCase() 
} println(upcasedBreed) 

Respuesta

8

Si usted lee la punta verde:

de manifestación puede ser definido con paréntesis o llaves rizado, pero utilizando llaves significa que usted no tiene que separar sus filtros con punto y coma . mayoría de las veces, se preferirá el uso de llaves cuando se tiene más de un filtro , misiones, etc.

Así que para la comprensión oral con () and {} son los mismos que lo único que el cambio es el separador utilizado : para () tiene que usar un semicolon ";" como separador y para {} utiliza new line.

+12

Otra de las funciones WTF de Scala. Un gran lenguaje, pero lleno de azúcar que no solo es innecesario, sino posiblemente dañino. – andyczerwonka

+1

La inferencia de semiconductor no es gratuita. La otra vez que muerde es 'val a = 1 + 2 + 3 + 4'. Esto se analiza como 'val a = 1. + (2). + (3); 4.unario _ +() ' – retronym

+0

Tenga en cuenta que el primer ejemplo no se compila. – retronym