繁体   English   中英

匹配有状态子类 object 时,我可以避免在模式匹配中使用 asInstanceOf 吗?

[英]Can I avoid using asInstanceOf in a pattern match when matching a stateful subclass object?

当我对Var("x")Number(7)之类的表达式建模并编写带有模式匹配的 eval function 时,我遇到了无法避免使用“asInstanceOf”方法的情况。

2个限制

  • 我不想通过在 Expr 中声明一个eval方法并在其子类中定义它来避免模式匹配(参见表达式问题,我更喜欢模式匹配)。

  • 我也不想要像Var("x", 7)这样的东西。

sealed trait Expr
object Expr {
  def eval(e: Expr): Int = e match {
    case Number(n) => n
    case Var(_) => e.asInstanceOf[Var].getValue()
  }
}
case class Number(n: Int) extends Expr
case class Var(s: String) extends Expr {
  var value = 0
  def getValue(): Int = value
  def updateValue(x: Int): Unit = {
    this.value = x
  }
}
val x = Var("x")
x.updateValue(1)
Expr.eval(x) // 1

当我这样定义第二种情况时: case Var(x) => Var(x).getValue() ,我得到Expr.eval(x) // 0 这是因为右侧的Var(x)将构造一个值为0的新Var

我可以使用asInstanceOf但在改进的意义上,我想知道是否有比使用asInstanceOf更干净的解决方案,我还没有找到。

您可以使用@将变量绑定到模式。 像这样使用它:

def eval(e: Expr): Int = e match {
    case Number(n) => n
    case v@Var(_) => v.getValue()
}

您还可以检查模式匹配中变量的类型

def eval(e: Expr): Int = e match {
    case Number(n) => n
    case v: Var => v.getValue()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM