【scala初學】class , object ,case classes

在前面章節裏,咱們瞭解了 class ,object的區別,簡單回顧下程序員

calss 靜態模板(理解成傳統的class就能夠)app

object 單例類,對object作點補充ide

1. 既然是單例,就不能被new,如object名爲SharkObj不能寫成spa

//var so = new SharkObj //error
var so = SharkObj //正確

2. 能夠直接寫類名調用方法,假設SharkObj有方法m(x:Int)scala

SharkObj.m(1)

 

那case classes 又是作什麼的呢? 你能夠就把他理解成一個普通的class,可是又略有不一樣,總結以下:繼承

  1. 不須要寫 new, 可是能夠寫ci

  2. 默認是public ,在任何地方調用get

  3. 默認實現了toStringhash

  4. 不能被繼承it

 

對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"));
}
相關文章
相關標籤/搜索