在Scala中访问patern matcher中匹配的obect

时间:2017-08-08 10:28:29

标签: scala functional-programming pattern-matching

我目前正在 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 ClassCat class是唯一具有Cat class功能的人。在模式匹配器中,我想让猫爬上树。

什么是适当的Scala功能方式来做这样的事情?

1 个答案:

答案 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)
}