Intenté combinar argumentos implícitos con clases de casos, pero me quedé atascado.Clase de caso y argumentos implícitos y coincidencia de patrones
case class C(i: Int)(implicit b: Boolean)
val c1 = C(1)(true)
implicit val b = true
val c2 = C(2)
c1 match {
case C(i)(b) => // doesn´t work
case C(i,b) => // doesn´t work
case C(i) => // works, but wanted: if (b) i else 0
}
De acuerdo con la especificación del lenguaje Scala se inunda debido a que el compilador genera objeto extractora para las clases de caso: Mi implícita Boolean
no es un miembro de la clase resultante caso, por lo que tiene que estar en el segundo (implícita) lista de argumentos (que yo no encuentro en el compañero object's aplicar el método, por desgracia):
una definición de clase caso de
c[tps](ps1). . .(psn)
con parámetros de tipo y valortps
parámetrosps
genera implícitamente un objeto extractora (§ 8.1.8) que se define como sigue:
object c {
def apply[tps](ps1). . .(psn): c[tps] = new c[Ts](xs1). . .(xsn)
def unapply[tps](x: c[tps]) =
if (x eq null) scala.None
else scala.Some(x.xs11, . . . , x.xs1k)
}
¿Cómo puedo definir una clase de caso con los miembros que se suministran de forma implícita en el momento de la creación?
En realidad, creo que * puede * definir el 'objeto C' para anular la clase de caso suministrada' unapply'. Además, 'implícito b' no se convierte automáticamente en' val b', por lo que hay algo más de trabajo. –
"No se puede resolver la sobreaplicación sobrecargada" :) Y en cuanto a val, sí, estaba a mitad de edición. :) –
Supongo que entonces, podría escribir igualmente: 'c1 coincidencia {caso x @ C (i) => if (x.b) i else 0}' – Mahdi