Scala 模式匹配与表达式格式化全解析
1. 密封类(Sealed Classes)
在编写模式匹配时,确保覆盖所有可能的情况至关重要。但在 Scala 中,由于新的 case 类可以随时在任意编译单元中定义,这使得编译器难以判断所有可能的情况。为了解决这个问题,可以将 case 类的超类声明为密封类。
密封类不能在同一文件之外添加新的子类,这在模式匹配中非常有用,因为你只需关注已知的子类。而且,编译器会对密封类的子类进行模式匹配时,若发现有遗漏的情况,会给出警告信息。
以下是一个将 Expr
类转换为密封类的示例:
sealed abstract class Expr
case class Var(name: String) extends Expr
case class Number(num: Double) extends Expr
case class UnOp(operator: String, arg: Expr) extends Expr
case class BinOp(operator: String, left: Expr, right: Expr) extends Expr
若定义一个模式匹配,遗漏了某些可能的情况,如下所示:
def describe(e: Expr): String = e match {
case Number(_) => "a number"
case Var(_) => "a varia