Мне интересно, как я могу использовать сопоставление шаблонов нескольких типов. Я имею:
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()
}
Поэтому я хотел бы написать что-то вроде:
x match {
case a @ (MyFirst | MySecond) => doSomething()
case _ => doSomethingElse()
}
Я видел похожую конструкцию в каком-то уроке, но это дает мне ошибку:
pattern type is incompatible with expected type;
[error] found : object MyFirst
[error] required: MyAbstract
Итак, есть ли способ определить несколько разных типов в предложении case? Думаю, это сделало бы код красивее. Как будто у меня их будет 5, я напишу один и тот же код 5 раз (вызов doSomething ()).
Заранее спасибо!
scala
types
pattern-matching
Псисоев
источник
источник
doSomething
случаев, почему бы не сопоставитьcase a : MyAbstract
then ...?Ответы:
Вам не хватает скобок для классов case. Классы case без списков параметров устарели.
Попробуй это:
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() }
Если у вас слишком много параметров для ваших классов case и вам не нравится писать длинные
Foo(_,_,..)
шаблоны, то, возможно,:x match { case aOrB @ (_:MyFirst | _:MySecond) => doSomething(aOrB) case _ => doSomethingElse() }
Или просто:
x match { case _:MyFirst | _:MySecond => doSomething(x) // just use x instead of aOrB case _ => doSomethingElse(x) }
Но, возможно, вам просто нужны одноэлементные объекты case?
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() }
источник
obj @ (_: MyFirst | _: MySecond)
?obj
в тех случаях, когда использую вdoSomething
звонке. В моем случае вызовdoSomething
не использовалсяobj
, поэтому он мне не нужен. Но в любом случае спасибо за комментарий!