【scala初学】class,object,case classes


前の章ではclass,objectの違いを理解し,簡単に振り返った.
calss静的テンプレート(従来のclassと理解すればよい)
object単例クラス、objectにポイント補完
1.一例である以上、object名SharkObjでは書けないnew
//var so = new SharkObj //error
var so = SharkObj //  

2.直接クラス名呼び出し方法を書くことができ、SharkObjに方法m(x:Int)があると仮定する.
SharkObj.m(1)

 
case classesは何をしていますか?彼を普通のclassと理解することができますが、少し違います.以下にまとめます.
  • newを書く必要はありませんが、
  • と書くことができます.
  • デフォルトはpublicであり、
  • は任意の場所で呼び出されます.
  • デフォルトではtoString
  • が実装されています.
  • は継承できません
  •  
    case calssに対する疑問の声が高く、価値がないと感じます.公式原文:
    It makes only sense to define case classes if pattern matching is used to decompose data structures.
     
    もちろん、pattern matchingの下で意味があるという話だけは過激で、少なくとも一部のベテランプログラマーは他の意見を持っています.
    get auto-generated equals, hashCode, toString, static apply() for shorter initialization, etc.
     
    ここで簡単に表すと、match caseの制御文と理解される
    以下、公式の例を皆さんに貼ります.
    abstract class Term
    case class Var(name: String) extends Term
    case class Var1 extends Term
    case class Fun(arg: String, body: Term) extends Term
    case class App(f: Term, v: Term) extends Term
    
    object TermTest extends scala.App {
      def printTerm(term: Term) {
        term match {
          case Var(n) =>
            print(n)
          case Fun(x1, b) =>
            print("^" + x1 + ".")
            printTerm(b)
          case App(f, v) =>
            print("(")
            printTerm(f)
            print(" ")
            printTerm(v)
            print(")")
        }
      }
      def isIdentityFun(term: Term): Boolean = term match {
        case Fun(x, Var(y)) if x == y => true
        case _ => false
      }
      val id = Fun("x", Var("x"))
      val t = Fun("x", Fun("y", App(Var("x"), Var("y"))))
      printTerm(t)
      println
      println(isIdentityFun(id))
      println(isIdentityFun(t))
      println(new Var1==new Var1);
      println(new Var("")==new Var("1"));
    }