scala case class與match

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

相關文章
相關標籤/搜索