我目前正在 Coursera 上学习在Scala中的函数编程原理,我刚刚学习了模式匹配。我正在尝试做一些看似不可能的事情,我想知道什么是正确的习语。
这里有一些课程代码:
trait Expr
case class Number(n: Int) extends Expr {
def next = n + 1 // I've added this method
}
case class Sum(e1: Expr, e2: Expr) extends Expr
def show(e: Expr): String = e match {
case Number(n) => n.toString
case Sum(l, r) => show(l) + " + " + show(r)
}
使用模式匹配器时,您可以访问匹配对象的参数(例如n
的{{1}})但您无法访问匹配的对象(因此Number(n)
例如,我会喜欢这样的事情:
Number(n)
我知道我可以做 case Number(n) => 'referenceToMatchedObject'.next
,但这并不优雅。
也许我仍然在考虑OO风格,但我发现能够添加可以应用于匹配对象的特定功能是很好的。
另一个例子:假设我有一个case Number(n) => Number(n).next
和一个Animal Trait/Abstract Class
。 Cat class
是唯一具有Cat class
功能的人。在模式匹配器中,我想让猫爬上树。
什么是适当的Scala功能方式来做这样的事情?
答案 0 :(得分:1)
这就是你想要的:
def show2(e: Expr): String = e match {
case n @ Number(1) => n.next.toString
case n : Number => n.next.toString
case Sum(l, r) => show(l) + " + " + show(r)
}