Para crear una nueva clase que se puede utilizar en un Scala para la comprensión, parece que todo lo que tiene que hacer es definir una función de mapa:¿por qué tiene que definirse el filtro para la coincidencia de patrones en un bucle for en Scala?
scala> class C[T](items: T*) {
| def map[U](f: (T) => U) = this.items.map(f)
| }
defined class C
scala> for (x <- new C(1 -> 2, 3 -> 4)) yield x
res0: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))
Pero eso sólo funciona para simple para bucles donde no hay coincidencia de patrón en el lado izquierdo de <-
. Si intenta modelar el partido allí, se obtiene una queja de que el método filter
no está definido:
scala> for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v
<console>:7: error: value filter is not a member of C[(Int, Int)]
for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v
¿Por qué es el filtro necesario para aplicar el ajuste de patrones aquí? Yo hubiera pensado Scala acaba de traducir el bucle de arriba en el equivalente map
llamada:
scala> new C(1 -> 2, 3 -> 4).map{case (k, v) => k -> v}
res2: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))
pero que parece funcionar bien, por lo que el bucle debe traducirse en algo más. ¿A qué se traduce eso que necesita el método filter
?
Comprobé el código compilado con y sin '5'. Cuando no hay '5', el filtro no se usa. – IttayD
Wow, nunca me di cuenta de que para los bucles arrojaría silenciosamente elementos que no concuerden. Eso suena como un gotcha sutil, es mejor que tenga cuidado. – Steve
La versión 'map' es casi tan peligrosa, ya que no hay ninguna advertencia de que pueda arrojarla. Desafortunadamente, actualmente no existe una sintaxis para desestructurar los argumentos en un literal de función sin usar una función parcial. –