以下是常见的scala模式匹配实例。
variableName @ pattern
下面这个示例
abstract class A; // sealed abstract class A
case class B(a:Int) extends A;
case class C(a:Int) extends A;
case class D(a:Int) extends A;
val a:A = B(1);
a match {
case e @ B(_) => println(e)
case e @ C(_) => println(e)
}
模式匹配中case e @ B(_)
就是模式匹配别名形式,实际匹配的模式是B(_)
,用变量e
来等价替代,实际效果与case e : B
是一样的。
再多说一句,抽象类A
可以用sealed修饰。修饰后,表明A的子类只能在A类所在的文件内声明,不可以在文件外,这也正是sealed的封装之意。另外,模式匹配时编译器会强行检查是否已经匹配到了所有可能情况,若没有,会给出编译警告!