Scala - Örüntü Eşleştirme

Model eşleştirme, Scala'nın fonksiyon değerleri ve kapanışlardan sonra en yaygın kullanılan ikinci özelliğidir. Scala, mesajların işlenmesinde model eşleştirme için büyük destek sağlar.

Bir kalıp eşleşmesi, her biri anahtar kelimeyle başlayan bir dizi alternatif içerir case. Her alternatif birpattern ve bir veya daha fazla expressions, desen eşleşirse değerlendirilecektir. Ok sembolü =>, deseni ifadelerden ayırır.

Bir tamsayı değeriyle nasıl eşleştirileceğini gösteren aşağıdaki örnek programı deneyin.

Misal

object Demo {
   def main(args: Array[String]) {
      println(matchTest(3))
   }
   
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

Yukarıdaki programı şuraya kaydedin: Demo.scala. Bu programı derlemek ve çalıştırmak için aşağıdaki komutlar kullanılır.

Komut

\>scalac Demo.scala
\>scala Demo

Çıktı

many

Case deyimlerine sahip blok, tam sayıları dizelerle eşleyen bir işlevi tanımlar. Eşleme anahtar sözcüğü, bir nesneye bir işlev (yukarıdaki kalıp eşleme işlevi gibi) uygulamanın uygun bir yolunu sağlar.

Farklı türlerdeki modellerle bir değeri eşleştiren aşağıdaki örnek programı deneyin.

Misal

object Demo {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
   }
   
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

Yukarıdaki programı şuraya kaydedin: Demo.scala. Bu programı derlemek ve çalıştırmak için aşağıdaki komutlar kullanılır.

Komut

\>scalac Demo.scala
\>scala Demo

Çıktı

2
many
one

Vaka Sınıflarını kullanarak eşleştirme

case classesbüyük / küçük harf ifadeleriyle desen eşleştirmede kullanılan özel sınıflardır. Sözdizimsel olarak bunlar, özel bir değiştiriciye sahip standart sınıflardır:case.

Aşağıdakini deneyin, durum sınıfını kullanan basit bir örüntü eşleştirme örneğidir.

Misal

object Demo {
   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)
}

Yukarıdaki programı şuraya kaydedin: Demo.scala. Bu programı derlemek ve çalıştırmak için aşağıdaki komutlar kullanılır.

Komut

\>scalac Demo.scala
\>scala Demo

Çıktı

Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?

Case anahtar sözcüğünü eklemek, derleyicinin bir dizi yararlı özelliği otomatik olarak eklemesine neden olur. Anahtar sözcük, örüntü eşleştirmede büyük / küçük harf ifadeleriyle bir ilişki önerir.

İlk olarak, derleyici yapıcı argümanlarını otomatik olarak değişmez alanlara (vals) dönüştürür. Val anahtar sözcüğü isteğe bağlıdır. Değiştirilebilir alanlar istiyorsanız, var anahtar sözcüğünü kullanın. Bu nedenle, yapıcı argüman listelerimiz artık daha kısa.

İkincisi, derleyici otomatik olarak uygular equals, hashCode, ve toStringyapıcı bağımsız değişkenleri olarak belirtilen alanları kullanan sınıfa yönelik yöntemler. Yani artık kendi toString () yöntemimize ihtiyacımız yok.

Son olarak, ayrıca Person sınıf boş hale gelir çünkü tanımlamamız gereken hiçbir yöntem yoktur!