type - Coincidencia de patrones de tipo mĂșltiple Scala
type parameter scala (1)
Me pregunto cómo puedo usar la coincidencia de patrones de tipos múltiples. Yo tengo:
abstract class MyAbstract
case class MyFirst extends MyAbstract
case class MySecond extends MyAbstract
case class MyThird extends MyAbstract // shouldn''t be matched and shouldn''t call doSomething()
val x: MyAbstract = MyFirst
x match {
case a: MyFirst => doSomething()
case b: MySecond => doSomething()
case _ => doSomethingElse()
}
Entonces me gustaría escribir algo como:
x match {
case a @ (MyFirst | MySecond) => doSomething()
case _ => doSomethingElse()
}
Vi una construcción similar en algún tutorial, pero me da error:
pattern type is incompatible with expected type;
[error] found : object MyFirst
[error] required: MyAbstract
Entonces, ¿hay alguna manera de definir algunos tipos diferentes en la cláusula de casos? Creo que haría que el código sea más bonito. Como si tuviera 5 de ellos, escribiré el mismo código 5 veces (llamando doSomething ()).
¡Gracias por adelantado!
Te faltan los paréntesis para tus clases de casos. Las clases de casos sin listas de parámetros están en desuso.
Prueba esto:
abstract class MyAbstract
case class MyFirst() extends MyAbstract
case class MySecond() extends MyAbstract
val x: MyAbstract = MyFirst()
x match {
case aOrB @ (MyFirst() | MySecond()) => doSomething(aOrB)
case _ => doSomethingElse()
}
Si tiene demasiados parámetros para sus clases de casos y no le gusta tener que escribir patrones largos de Foo(_,_,..)
, entonces quizás:
x match {
case aOrB @ (_:MyFirst | _:MySecond) => doSomething(aOrB)
case _ => doSomethingElse()
}
O solo:
x match {
case _:MyFirst | _:MySecond => doSomething(x) // just use x instead of aOrB
case _ => doSomethingElse(x)
}
¿Pero quizás solo querías objetos de caso únicos?
abstract class MyAbstract
case object MyFirst extends MyAbstract
case object MySecond extends MyAbstract
val x: MyAbstract = MyFirst
x match {
case aOrB @ (MyFirst | MySecond) => doSomething()
case _ => doSomethingElse()
}