在前面章节里,我们了解了 class ,object的区别,简单回顾下
calss 静态模板(理解成传统的class就可以)
object 单例类,对object做点补充
1. 既然是单例,就不能被new,如object名为SharkObj不能写成
//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")); }
转载于:https://blog.51cto.com/yjplxq/1415533