English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

التطابق النمطي لScala

يقدم Scala ميكانيكية تطابق نموذج قوية وتطبيقها واسع.

تتكون نموذج التطابق من سلسلة من الخيارات، حيث تبدأ كل خيار بمفتاح case. تتضمن كل خيار نموذجًا وإلى عدة تعبيرات. رمز السهم => تم فصل النموذج والتعبير.

فيما يلي مثال بسيط على تطابق نموذج القيمة الصحيحة:

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\"
   }
}

عند تنفيذ الكود أعلاه، سيتم إظهار النتيجة التالية:

$ scalac Test.scala 
$ scala Test
many

match يتطابق مع switch في Java، ولكن يكتب بعد تعبير الخيار. أي: اختيار match {خيارات}

يتم إكمال حساب تعبير match من خلال محاولة كل نموذج بالترتيب المكتوب في الكود، وعندما يتم العثور على case يتطابق، لا يتم استمرار التحقق من النماذج المتبقية.

دعونا نرى الآن تطابق نموذج مختلف الأنواع:

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\"
   }
}

عند تنفيذ الكود أعلاه، سيتم إظهار النتيجة التالية:

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

في المثال، case الأول يتطابق مع القيمة الصحيحة 1، والثاني يتطابق مع القيمة النصية two، والثالث يتطابق مع نموذج النوع، ويستخدم لتحديد ما إذا كانت القيمة المدخلة هي نوع صحيح أم لا، وهو أفضل من استخدام isInstanceOf لتحديد النوع مقارنة بـ match. والcase الرابع هو الخيار المبدئي للطابق، أي الخيار الذي لا يتم العثور عليه في أي طابق آخر، وهو مشابه لـ default في switch.

استخدام الفئات النموذجية

تعريف الفئة باستخدام كلمة المفتاح case هي فئة نموذجية (case classes)، وهي نوع خاص من الفئات، تم تحسينها لاستخدامها في التطابق النمطي.

فيما يلي مثال بسيط على فئة نموذجية:

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("مرحبًا Alice!")
            case Person("Bob", 32) => println("مرحبًا Bob!")
            case Person(name, age) =>
               println("العمر: " + age + " سنة، الاسم: " + name + "؟")
         }
      }
   }
   // صفة مثالية
   case class Person(name: String, age: Int)
}

عند تنفيذ الكود أعلاه، سيتم إظهار النتيجة التالية:

$ scalac Test.scala 
$ scala Test
مرحبًا Alice!
مرحبًا Bob!
العمر: 32 سنة، الاسم: Charlie؟

يحدث ما يلي تلقائيًا عند إعلان الصف المثالي:

  • يصبح كل معامل المبنى val، ما لم يتم إعلانه كvar، ولكن ليس من المستحب القيام بذلك؛

  • تم تقديم طريقة apply في الكائن المرافق، لذا يمكنك بناء الكائنات دون استخدام كلمة new؛

  • قدم طريقة unapply لتشغيل التطابق النمطي؛

  • أنشئ طرق toString،equals،hashCode وcopy، ما لم يتم إعطاء تعريف لهذه الطرق بوضوح.