匹配有状态子类对象时,我可以避免在模式匹配中使用 asInstanceOf 吗?
Can I avoid using asInstanceOf in a pattern match when matching a stateful subclass object?
当我对 Var("x")
或 Number(7)
等表达式进行建模并编写带有模式匹配的 eval 函数时,我 运行 遇到了无法避免使用 ´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)
将构造一个新的 Var
,其值为 0
.
我可以使用 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()
}
当我对 Var("x")
或 Number(7)
等表达式进行建模并编写带有模式匹配的 eval 函数时,我 运行 遇到了无法避免使用 ´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)
将构造一个新的 Var
,其值为 0
.
我可以使用 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()
}