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.