while utiliza tipos switch simplificado quimica que negacion metrologia menciona laboratorio instrucción fisica exactitud else ejemplos diferencia definicion condiciones class scala pattern-matching case unapply

class - utiliza - tipos de condiciones en c#



¿Cómo hacer un patrón de coincidencia de una clase con múltiples listas de argumentos? (3)

Considera esta clase:

class DateTime(year: Int, month: Int, day: Int)(hour: Int, minute: Int, second: Int)

cómo se unapply método de no aplicación, si me gustaría unapply contra algo como:

dt match { case DateTime(2012, 12, 12)(12, _, _) => // December 12th 2012, 12 o''clock /* ... */ }

Intenté esto:

def unapply(dt: DateTime) = Some((dt.year, dt.month, dt.day),(dt.hour, dt.minute, dt.second))

Pero eso realmente no funcionó.


Las clases de casos coinciden (y hacen sus otras cosas ingeniosas) solo en el primer conjunto de parámetros:

scala> case class A(i: Int)(j: Int) { } defined class A scala> A(5)(4) match { case A(5) => "Hi" } res14: java.lang.String = Hi scala> A(5)(4) == A(5)(9) res15: Boolean = true

Si no es una clase de caso, puede definir la no aplicación para que sea lo que desee, por lo que realmente depende del implementador de la clase. De forma predeterminada, no hay ninguna aplicación, por lo que solo puede coincidir con el tipo.

Si desea utilizar las características de la clase de casos ingeniosas, incluido el poder hacer coincidir y hacer la igualdad en todo, pero tener algún tipo de división, podría anidar las clases de casos:

case class Time(hour: Int, minute: Int, second: Int) { } case class Date(year: Int, month: Int, day: Int) { } case class DateTime(date: Date, time: Time) { } scala> val dt = DateTime(Date(2011,5,27), Time(15,21,50)) scala> dt match { case DateTime(Date(2011,_,_),Time(h,m,50)) => println(h + ":" + m) } 15:21


Probablemente no funcionó porque Scala no tiene operador de coma, y ​​está devolviendo Some((a,b),(x,y)) desde el extractor. Si Tuple2[Tuple3[A,B,C],Tuple3[X,Y,Z]] Some(((a,b,c),(x,y,z))) lugar (es decir, un Tuple2[Tuple3[A,B,C],Tuple3[X,Y,Z]] , creo que probablemente funcionaria


Solo para aprovechar la respuesta de Rex, no solo puede hacer un patrón de coincidencia en el primer bloque de parámetros, sino que este comportamiento se debe en gran medida al diseño.

La pregunta más interesante es por qué las clases de casos, como tipos de datos algebraicos, incluso admiten múltiples listas de parámetros ...

No existe una justificación lo suficientemente sólida como para agregar un comportamiento especial para las clases de casos, y varias listas de parámetros resultan ser bastante útiles. En el código de producción, esta instalación a menudo solo se usa para proporcionar argumentos implícitos, que naturalmente no querría hacer coincidir con el patrón.