Scala-模式匹配错误
我正在玩模式匹配,但我很难理解这段代码的错误:Scala-模式匹配错误,scala,Scala,我正在玩模式匹配,但我很难理解这段代码的错误: class Expr { case class Number(v : Int) extends Expr case class Sum(a : Expr, b : Expr) extends Expr def show(e: Expr): String = { e match { case Number(a) => a.toString() case Sum(a, b) => "(" +
class Expr {
case class Number(v : Int) extends Expr
case class Sum(a : Expr, b : Expr) extends Expr
def show(e: Expr): String = {
e match {
case Number(a) => a.toString()
case Sum(a, b) => "(" + show(a) + "+" + show(b) + ")"
}
}
override def toString() = show(this)
}
class Number(v : Int) extends Expr
class Sum(a : Expr, b : Expr) extends Expr
object Number {
def apply(v : Int) = new Number(v)
}
object Sum extends Expr {
def apply(a : Expr, b : Expr) = new Sum(a, b)
}
object ExpressionProblem {
def main(args: Array[String]) {
val p = Sum( Number(3), Number(4))
println( p )
}
}
当我尝试执行println
时,它抛出一个匹配错误
Exception in thread "main" scala.MatchError: an instance of class week4.Expr$Sum
at week4.Expr.show(ExpressionProblem.scala:8)
at week4.Expr.toString(ExpressionProblem.scala:14)
at java.lang.String.valueOf(String.java:2994)
at java.io.PrintStream.println(PrintStream.java:821)
at scala.Console$.println(Console.scala:148)
at scala.Predef$.println(Predef.scala:315)
at week4.ExpressionProblem$.main(ExpressionProblem.scala:31)
at week4.ExpressionProblem.main(ExpressionProblem.scala)
您正在发送
Sum
类的实例,但正在尝试匹配Sum
案例类的实例。删除类并使案例类对代码可见:
trait Expr {
def show(e: Expr): String = e match {
case Number(a) => a.toString()
case Sum(a, b) => "(" + show(a) + "+" + show(b) + ")"
}
override def toString() = show(this)
}
case class Number(v : Int) extends Expr
case class Sum(a : Expr, b : Expr) extends Expr
object ExpressionNoProblem {
def main(args: Array[String]) {
val p = Sum(Number(3), Number(4))
println(p)
}
}
您正在发送
Sum
类的实例,但正在尝试匹配Sum
案例类的实例。删除类并使案例类对代码可见:
trait Expr {
def show(e: Expr): String = e match {
case Number(a) => a.toString()
case Sum(a, b) => "(" + show(a) + "+" + show(b) + ")"
}
override def toString() = show(this)
}
case class Number(v : Int) extends Expr
case class Sum(a : Expr, b : Expr) extends Expr
object ExpressionNoProblem {
def main(args: Array[String]) {
val p = Sum(Number(3), Number(4))
println(p)
}
}
您正在发送
Sum
类的实例,但尝试匹配Sum
案例类的实例。您正在发送Sum
类的实例,但尝试匹配Sum
案例类的实例。感谢您的解决方案。但我不明白这一点,你能解释一下区别吗?你定义了Sum(和Number)两次:一次作为内格类Expr#Sum
另一次作为常规类Sum
。您的匹配尝试匹配一个案例类(Expr#Sum
),但实际上您正在发送一个类的实例(Sum
)。相似的名称,但完全不同的类除此之外,常规类不能与样式(提取器)大小写Sum(a,b)
-它们只能作为类型匹配大小写s:Sum
。看,谢谢你的解决方案。但我不明白这一点,你能解释一下区别吗?你定义了Sum(和Number)两次:一次作为内格类Expr#Sum
另一次作为常规类Sum
。您的匹配尝试匹配一个案例类(Expr#Sum
),但实际上您正在发送一个类的实例(Sum
)。相似的名称,但完全不同的类除此之外,常规类不能与样式(提取器)大小写Sum(a,b)
-它们只能作为类型匹配大小写s:Sum
。看见