what type switch pattern parameter generic scala types pattern-matching

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() }