我想知道如何使用多种类型模式匹配。我有:
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
那么有没有办法在 on case 子句中定义几种不同的类型呢?我认为这会让代码更漂亮。就好像我有 5 个一样,我会编写相同的代码 5 次(调用 doSomething())。
您的案例类别缺少括号。
不推荐使用没有参数列表的案例类。
尝试这个:
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()
}
如果您的案例类有太多参数并且不喜欢写得太长Foo(_,_,..)
模式,那么也许:
x match {
case aOrB @ (_:MyFirst | _:MySecond) => doSomething(aOrB)
case _ => doSomethingElse()
}
Or just:
x match {
case _:MyFirst | _:MySecond => doSomething(x) // just use x instead of aOrB
case _ => doSomethingElse(x)
}
但也许您只想要单例案例对象?
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()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)