模式匹配是一个很棒的功能,因为它易于使用。
它比广泛使用的面向对象语言中的大多数设计模式解决了“如何为对象系统带来功能”的问题。例如有访问者模式,它将算法与其对象结构分开。这个想法很棒,因为它允许我们改变对象的行为而无需触及它们的类。但另一方面,这种模式在符号的过于复杂和冗长方面失败了。使用模式匹配,这可以很容易地解决:
def calc(e: Expression): Double = e match {
case Num(n) => n
case Add(a, b) => calc(a)+calc(b)
case Sub(a, b) => calc(a)-calc(b)
...
}
这将 AST 的计算与其定义分开,并且比多态访问者模式更易于阅读。
因为模式匹配非常简单,所以我们可以在任何地方使用它——你会在大多数 OO 语言中从未想过的地方找到它。一个很好的例子是 Actors,它使用代数数据类型 (ADT) 在彼此之间进行通信:
sealed trait Message
case class Hello(name: String) extends Message
case class Bye(name: String) extends Message
case class Question(q: Symbol) extends Message
class MySelf extends Actor {
def receive {
case Hello(name) => println("Hello "+name)
case Bye(name) => println("Buy "+name)
case Question('AreYouOk) => sender answer "I'm ok"
...
}
}
我希望通过使用访问者模式来实现这一点,你会获得很多乐趣!