Padanan corak skala


Scala menyediakan mekanisme padanan corak yang berkuasa dan digunakan secara meluas.

Padanan corak terdiri daripada urutan alternatif, setiap satu bermula dengan kata kunci kes. Setiap alternatif mengandungi corak dan satu atau lebih ungkapan. Simbol anak panah => memisahkan corak dan ungkapan.

Berikut ialah contoh padanan corak nilai integer mudah:

object Test {
   def main(args: Array[String]) {
      println(matchTest(3))

   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

Laksanakan kod di atas, hasil output ialah:

$ scalac Test.scala 
$ scala Test
many

padanan sepadan dengan suis dalam Java, tetapi ditulis selepas ungkapan pemilih. Iaitu: Padanan pemilih {alternatif}.

Ungkapan padanan melengkapkan pengiraan dengan mencuba setiap corak dalam susunan kod ditulis Selagi kes yang sepadan ditemui, kes yang selebihnya tidak akan terus sepadan.

Seterusnya mari kita lihat padanan corak jenis data yang berbeza:

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
      println(matchTest(6))

   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

Laksanakan kod di atas, hasil output ialah:

$ scalac Test.scala 
$ scala Test
2
many
one
scala.Int

Kes pertama dalam contoh sepadan dengan jenis integer Nilai 1, kes kedua sepadan dengan nilai rentetan dua, kes kedua sepadan dengan nilai rentetan dua, dan kes ketiga sepadan dengan corak jenis, yang digunakan untuk menentukan sama ada nilai masuk ialah integer dengan menggunakan isInstanceOf untuk menentukan jenis , menggunakan padanan corak adalah lebih baik. Kes keempat mewakili alternatif padanan penuh lalai, iaitu padanan apabila tiada padanan lain ditemui, serupa dengan lalai dalam suis.


Menggunakan kelas sampel

Takrifan kelas yang menggunakan kata kunci kes ialah kelas kes ialah kelas khas yang dioptimumkan untuk digunakan untuk pemadanan corak.

Berikut ialah contoh mudah kelas sampel:

object Test {
   def main(args: Array[String]) {
   	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 Person("Alice", 25) => println("Hi Alice!")
            case Person("Bob", 32) => println("Hi Bob!")
            case Person(name, age) =>
               println("Age: " + age + " year, name: " + name + "?")
         }
      }
   }
   // 样例类
   case class Person(name: String, age: Int)
}

Laksanakan kod di atas, hasil output ialah:

$ scalac Test.scala 
$ scala Test
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?

Apabila mengisytiharkan kelas sampel, proses berikut berlaku secara automatik :

  • Setiap parameter pembina menjadi val, melainkan diisytiharkan secara eksplisit sebagai var, tetapi ini tidak disyorkan; kaedah disediakan dalam objek pengiring, jadi objek boleh dibina tanpa menggunakan kata kunci baharu;

  • Jana toString, equals, hashCode dan kaedah salin melainkan definisi kaedah ini diberikan secara eksplisit.