val alice = new Person("Alice", 25)
val bob = new Person("Bob", 32)
val charlie = new Person("Charlie", 32)
for(person <- List(alice,bob,charlie)){
person match{
case alice => {println("hi,alice")}
case bob =>println("hi,bob")
case charlie => println("hi,charlie")
}
}
val alice1 = new Person1("Alice1", 25)
val bob1 = new Person1("Bob1", 32)
val charlie1 = new Person1("Charlie1", 32)
for(person <- List(alice1,bob1,charlie1)){
person match{
case Person1("Alice1", 25) => {println("hi,alice1")}
case Person1("Bob1", 32) =>println("hi,bob1")
case Person1("Charlie1", 32) => println("hi,charlie1")
}
}app
class Person(val name:String,val age:Int){}
case class Person1( val name:String, val age:Int){}less
打印結果:函數
hi,alicescala
hi,alicecode
hi,alice對象
hi,alice1編譯器
hi,bob1string
hi,charlie1it
當咱們申明一個case class,則編譯器會爲咱們作以下事情編譯
(參考https://www.jianshu.com/p/deb8ca125f6c):
1)建立class及其伴生對象
scala> case class Person(lastname: String, firstname: String, birthYear: Int) defined class Person scala> val p = Person("Lacava", "Alessandro", 1976) p: Person = Person(Lacava,Alessandro,1976)
2)主構造函數的參數列表自動加val,若是要想讓字段可寫,則須要手動加var
3)添加equals,tostring方法。因爲scala中==老是表明equals,因此case class實例老是可比較的
4)生成copy方法,能夠經過一個實例複製出另外一個實例
5)實現apply和unapply方法
scala> case class A( a: Int ) defined class A scala> case class B( b: String ) defined class B scala> def classMath( x: AnyRef ): Unit = { | x match { | case A(a) => println( "A:" + a ) | case B(b) => println( "B:" + b ) | case A => println( A.apply(100) ) | } | } classMath: (x: AnyRef)Unit scala> val a = A( 1 ) a: A = A(1) scala> val b = B( "b" ) b: B = B(b) scala> classMath( a ) A:1 scala> classMath( b ) B:b
也許你已經知道,在模式匹配中,當你的 case class 沒有參數的時候,你是在使用 case object 而不是一個空參數列表的 case class
scala> classMath( A )
A(100)
除了在模式匹配中使用以外,unapply
方法能夠讓你結構 case class 來提取它的字段,如:
scala> val Person(lastname, _, _) = p lastname: String = Lacava