2017-02-06 8 views
0

私はスカラ座に非常に新しいですし、次のコードでいくつかの未解決の問題だ方法を持っているん:スカラ - ない場合クラスにもそれが.unapply

object exprs{ 
     println("Welcome to the Scala worksheet") 

     def show(e: Expr): String = e match { 
     case Number(x) => x.toString 
     case Sum(l, r) => show(l) + " + " + show(r) 
     } 

     show(Sum(Number(1), Number(44))) 
    } 

    trait Expr { 
     def isNumber: Boolean 
     def isSum: Boolean 
     def numValue: Int 
     def leftOp: Expr 
     def rightOp: Expr 
     def eval: Int = this match { 
     case Number(n) => n 
     case Sum(e1, e2) => e1.eval + e2.eval 
     } 
    } 

    class Number(n: Int) extends Expr { 
     override def isNumber: Boolean = true 

     override def isSum: Boolean = false 

     override def numValue: Int = n 

     override def leftOp: Expr = throw new Error("Number.leftOp") 

     override def rightOp: Expr = throw new Error("Number.rightOp") 
    } 

    class Sum(e1: Expr, e2: Expr) extends Expr { 
     override def isNumber: Boolean = false 

     override def isSum: Boolean = true 

     override def numValue: Int = e1.eval + e2.eval 

     override def leftOp: Expr = e1 

     override def rightOp: Expr = e2 
    } 

私は次のエラーを取得:

エラー:オブジェクトの数がケースクラスではなく、またそれはunapplySeq /適用を解除するメンバー

エラー持っています:が見つかりません:値Sum

どうすれば解決できますか?おかげさまで

+1

[スカラパターンマッチングのcase節の[map expression]の可能な複製(http://stackoverflow.com/questions/27051030/map-expression-in-case-clause-in-scala-pattern-matching) –

+0

@ TzachZoharいいえ、それはすべての質問に関連していません。 OPの問題はパターンマッチングに限定されない。ここのOPは 'object'、' class'、 'case class'を理解していません。 –

答えて

1

でScala case classは、classのようなもので、他にもいくつかの特長があります。通常のクラスのために

class A(i: Int, s: String) 

あなたはこのようにそのインスタンスを作成することはできません、

val a = A(5, "five") // this will not work 

あなたは、新しいインスタンスを作成するためにnewを使用する必要があります。 case classを持っているので、これはcase classで動作します

case class B(i: Int, s: String) 

私たちは、このようなBの新しいインスタンスを作成することができ、

val b = B(5, "five") 

理由

val a = new A(5, "five") 

今、私たちはcase classを持って言うことができますが、あります自動的に作成されたコンパニオンオブジェクトで、applyunapplyメソッドを含むいくつかのユーティリティを提供します。

だから、この使用法val b = B(5, "five")は実際にはval b = B.apply(5, "five")です。ここでBclass Bではなく、実際にはapplyの方法であるobject Bの方法です。

同様に、スカラパターンマッチングでは、コンパニオンオブジェクトによって提供されるunapply(SeqLikeパターンの場合はunapplySeq)メソッドを使用します。したがって、通常のclassインスタンスはパターンマッチングでは機能しません。

具体的な理由でclassを定義し、case classを定義しないようにしたいが、依然としてパターンマッチングなどでそれらを使用したい場合は、必要なメソッドをコンパニオンオブジェクトに提供することができます。

また
class C(i: Int, s: String) { 
} 

object C { 

    def apply(i: Int, s: String) = new C(i, s) 

    def unapply(c: C) = Some((c.i, c.s)) 

} 

// now you can use any of the following to create instances, 

val c1 = new C(5, "five") 

val c2 = C.apply(5, "five") 

val c3 = C(5, "five") 

// you can also use pattern matching, 

c1 match { 
    case C(i, s) => println(s"C with i = $i and s = $s") 
} 

c2 match { 
    case C(i, s) => println(s"C with i = $i and s = $s") 
} 

、あなたはスカラ座を学ぶに新しいしているとして、あなたはおそらく、すべてのScalaの初心者のための最適なリソースであるhttp://danielwestheide.com/scala/neophytes.htmlをお読みください。

関連する問題