English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
المستخرج هو استخراج المعلمات التي يتم بناء العنصر منها.
تتضمن مكتبة Scala بعض المستخرجات المسبقة التعريف، وسنستعرضها بشكل عام.
مستخرج Scala هو عنصر يحتوي على طريقة unapply. تعتبر طريقة unapply العكس من طريقة apply: تقوم طريقة unapply باستقبال عنصر، ثم استخراج القيم من العنصر، عادة ما تكون هذه القيم تستخدم لإنشاء القيم الخاصة بالعنصر.
يظهر المثال أدناه مظهر مستخرج عنوان البريد الإلكتروني:
object Test { def main(args: Array[String]) { println ("طريقة Apply : " + apply("Zara", "gmail.com")); println ("طريقة Unapply : " + unapply("[email protected]")); println ("طريقة Unapply : " + unapply("Zara Ali")); } // طريقة التداخل (اختيارية) def apply(user: String, domain: String) = { user +"@"+ domain } // طريقة الاستخراج (مطلوبة) def unapply(str: String): Option[(String, String)] = { val parts = str split "@" if (parts.length == 2){ Some(parts(0), parts(1)) }else{ None } } }
إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:
$ scalac Test.scala $ scala Test طريقة Apply : [email protected] طريقة Unapply : Some((Zara,gmail.com)) طريقة Unapply : None
تعريف العنصر أعلاه يحتوي على طريقتين: apply و unapply الطريقة. يمكننا إنشاء العنصر دون استخدام عملية new. لذا يمكنك استخدام جملة Test("Zara", "gmail.com") لإنشاء النص "[email protected]".
طريقة unapply تعتبر العكس من طريقة apply: تقوم طريقة unapply باستقبال عنصر، ثم استخراج القيم من العنصر، عادة ما تكون هذه القيم تستخدم لإنشاء القيم الخاصة بالعنصر. في المثال، نستخدم تستخرج طريقة Unapply اسم المستخدم وجزء عنوان البريد الإلكتروني من العنصر.
في المثال أدناه، يعود طريقة unapply عند عدم كون النص غير عنوان بريد إلكتروني None. يتم عرض الكود كما يلي:
unapply("[email protected]") يساوي Some("Zara", "gmail.com") unapply("Zara Ali") يساوي None
عندما نستخدم كائنًا جديدًا من الفئة، يمكننا إضافة 0 أو أكثر من المعلمات، ويتم استدعاء عملية apply عند التكوين. يمكننا تعريف عملية apply في الفئة والأجسام.
كما ذكرنا من قبل، يتم استخدام unapply لاستخراج القيم التي نحددها، وهو عكس عملية apply. عندما نستخدم جملة match في كائن الإخراج، يتم تنفيذ unapply تلقائيًا، مثلما هو موضح أدناه:
object Test { def main(args: Array[String]) { val x = Test(5) println(x) x match { case Test(num) => println(x + " هو " + num + " ضعف!") //unapply تم استدعاؤه case _ => println("لا يمكن حساب") } } def apply(x: Int) = x * 2 def unapply(z: Int): Option[Int] = if (z % 2 == 0) Some(z / 2) else None }
إذا قمت بتشغيل الكود أعلاه، النتيجة ستكون:
$ scalac Test.scala $ scala Test 10 10 هو ضعف 5!