Scala 在匹配有状态子类对象时,是否可以避免在模式匹配中使用asInstanceOf?

Scala 在匹配有状态子类对象时,是否可以避免在模式匹配中使用asInstanceOf?,scala,pattern-matching,instanceof,Scala,Pattern Matching,Instanceof,当我对诸如Var(“x”)或Number(7)之类的表达式进行建模并编写带有模式匹配的求值函数时,我遇到了一个无法避免使用“asInstanceOf”方法的情况 2项限制 我不想通过在Expr中声明eval方法并在其子类中定义它来避免模式匹配(参见Expression problem,我更喜欢模式匹配) 我也不想要像Var(“x”,7)这样的东西 当我像这样定义第二个case时:case Var(x)=>Var(x).getValue(),我得到Expr.eval(x)//0。这是因为右侧的

当我对诸如
Var(“x”)
Number(7)
之类的表达式进行建模并编写带有模式匹配的求值函数时,我遇到了一个无法避免使用“asInstanceOf”方法的情况

2项限制

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

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

当我像这样定义第二个case时:
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()
}

是首选的样式,而不是
isInstanceOf
/
asInstanceOf
组合。我不得不说,可变案例类是一个糟糕的设计。而且case类必须总是
final
@colorbind哦,好的,是的。首先,我道歉,如果我听起来太势在必行,它应该更像是一个建议:“如果这解决了你的问题,请考虑接受这个答案”。第二,如果你觉得有人给了你更好的答案,你总是可以改变主意,接受不同的答案。第三,老实说,鉴于你的问题是一个非常基本的问题,答案很简单,不可能会有新的问题,所以现在接受它是有意义的。干杯:)@色盲可能你已经看到了,但以防万一。是的,评论是暂时的,如果它们已经有用了,我们通常会删除它们,就像在这种情况下一样。祝您编码愉快,欢迎来到SO社区。
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()
}