tutorial navisworks español scala

navisworks - Declaraciones de ''if'' para la comprensión de Scala



manual de navisworks 2018 en español pdf (2)

Por lo tanto, creo que está preguntando si es posible que la instrucción if en una comprensión para cambiar el tipo de resultado. La respuesta es "sí, pero ...".

Primero, entienda cómo se amplían las comprensiones. Aquí hay preguntas sobre el Desbordamiento de pila que lo discuten, y hay parámetros que puede pasar al compilador para que le muestre lo que está pasando.

De todos modos, este código:

val evenColl = for { i <- collection if(Even) } yield i

Se traduce como:

val evenColl = collection.withFilter(i => Even).map(i => i)

Por lo tanto, si el método withFilter cambia el tipo de colección, hará lo que quiera, en este simple caso. En casos más complejos, eso solo no funcionará:

for { x <- xs y <- ys if cond } yield (x, y)

se traduce como

xs.flatMap(ys.withFilter(y => cond).map(y => (x, y)))

En cuyo caso, flatMap está decidiendo qué tipo será devuelto. Si toma la indicación de qué resultado se devolvió, entonces puede funcionar.

Ahora, en Scala Collections, conFilter no cambia el tipo de la colección . Sin embargo, podrías escribir tus propias clases que harían eso.

¿Es posible en Scala especializarse en las condiciones dentro de un dentro de una comprensión? Estoy pensando en lo siguiente:

val collection: SomeGenericCollection[Int] = ... trait CollectionFilter case object Even extends CollectionFilter case object Odd extends CollectionFilter val evenColl = for { i <- collection if(Even) } yield i //evenColl would be a SomeGenericEvenCollection instance val oddColl = for { i <- collection if(Odd) } yield i //oddColl would be a SomeGenericOddCollection instance

Lo esencial es que al obtener i , obtengo una nueva colección de un tipo potencialmente diferente (por lo tanto, me refiero a ella como "especialización"), a diferencia de una versión filtrada del mismo tipo GenericCollection.

La razón por la que pregunto es que vi algo que no pude entender (se puede encontrar un ejemplo en la línea 33 de este ejemplo de ScalaQuery . Lo que hace es crear una consulta para una base de datos (es decir, SELECT ... FROM ... WHERE ... ), donde hubiera esperado que se repitiera sobre los resultados de dicha consulta.


sí, puede consultar este tutorial para ver un ejemplo sencillo. El ejemplo de consulta de scala que citó también está iterando en la colección, y luego utiliza esos datos para construir la consulta.