Scala多种类型模式匹配

psi*_*yev 66 types scala pattern-matching

我想知道如何使用多种类型模式匹配.我有:

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()
}
Run Code Online (Sandbox Code Playgroud)

所以我想写一些类似的东西:

x match {
 case a @ (MyFirst | MySecond) => doSomething()
 case _ => doSomethingElse()
}
Run Code Online (Sandbox Code Playgroud)

我在一些教程中看到了类似的构造,但它给了我错误:

pattern type is incompatible with expected type;
[error]  found   : object MyFirst
[error]  required: MyAbstract
Run Code Online (Sandbox Code Playgroud)

那么有没有办法在case子句中定义几个不同的类型?我认为它会使代码更漂亮.好像我将有5个,我会写相同的代码5次(调用doSomething()).

提前致谢!

Fai*_*aiz 119

您缺少案例类的括号.不推荐使用不带参数列表的案例类.

试试这个:

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()
}
Run Code Online (Sandbox Code Playgroud)

如果你的案例类有太多的params并且不喜欢编写长Foo(_,_,..)模式,那么可能:

x match {
   case aOrB @ (_:MyFirst | _:MySecond) => doSomething(aOrB)
   case _ => doSomethingElse()
}
Run Code Online (Sandbox Code Playgroud)

要不就:

x match {
   case _:MyFirst | _:MySecond => doSomething(x) // just use x instead of aOrB
   case _ => doSomethingElse(x)
}
Run Code Online (Sandbox Code Playgroud)

但也许你只想要单例案例对象?

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()
}
Run Code Online (Sandbox Code Playgroud)

  • 你错过了'obj @(_:MyFirst | _:MySecond)` (8认同)