簡體   English   中英

Scala-模式匹配MatchError

[英]Scala - Pattern Matching MatchError

我正在玩模式匹配,但是我很難理解這段代碼的問題:

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它會拋出MatchError。

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 case類的實例。 刪除類並使案例類對您的代碼可見:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM