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

Scala Option (الخيار)

جمعيات Scala

يستخدم نوع Scala Option (الخيار) لتعريف قيمة اختيارية (موجودة أو غير موجودة).

Option[T] هو حاوي قيم اختياري من نوع T: إذا كانت القيمة موجودة، فإن Option[T] هو Some[T]، وإذا لم تكن موجودة، فإن Option[T] هو None.

دعونا ننظر في قطعة من الكود الآن:

// على الرغم من أن Scala يمكن أن لا تعرف نوع المتغير، إلا أنني سأقوم بتعريف النوع لتحسين الوضوح
// تم تعريفه بشكل صريح
 
val myMap: Map[String, String] = Map("key1" -> "value")
val value1: Option[String] = myMap.get("key1")
val value2: Option[String] = myMap.get("key2")
 
println(value1) // Some("value1")
println(value2) // None

في الكود السابق، myMap هو دالة تحتوي على نوع المفتاح String ونوع القيمة String، ولكن ما يميزها هو أن get() يرجع نوع Option[String].

يستخدم Scala Option[String] لإخبارك: 'سأحاول إرجاع String، ولكن قد لا يكون هناك String لأعطيك'.

لم يتم العثور على البيانات المرتبطة بكليدة key2 في myMap، ويقوم get() بتحويله إلى None.

يوجد لـ Option نوعان فرعيان، هما Some و None، عندما يعود Some، يعني أن هذه الوظيفة قد أرسلت لك String بنجاح، ويمكنك الحصول على ذلك String من خلال استخدام طريقة get()، وإذا كان يعود None، فإن ذلك يعني أنه لا يوجد String يمكنك الحصول عليه.

مثال آخر:

object Test {
   def main(args: Array[String]) {
      val sites = Map("w3codebox" -> "ar.oldtoolbag.com", "google" -> "www.google.com")
     
      println("sites.get( \"w3codebox\" ) : " +  sites.get( "w3codebox" )) // Some(ar.oldtoolbag.com)
      println("sites.get( \"baidu\" ) : " +  sites.get( "baidu" ))  //  None
   }
}

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

$ scalac Test.scala 
$ scala Test
sites.get( "w3codebox" ) : Some(ar.oldtoolbag.com)
sites.get( "baidu" ) : None

يمكنك أيضًا استخدام التباين النمطي لعرض القيمة المُناسبة. مثل ما يلي:

object Test {
   def main(args: Array[String]) {
      val sites = Map("w3codebox" -> "ar.oldtoolbag.com", "google" -> "www.google.com")
     
      println("show(sites.get( \"w3codebox\")) : " +  
                                          show(sites.get( "w3codebox")) )
      println("show(sites.get( \"baidu\")) : " +  
                                          show(sites.get( "baidu")) )
   }
   
   def show(x: Option[String]) = x match {
      حالة Some(s) => s
      حالة None => "?"
   }
}

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

$ scalac Test.scala 
$ scala Test
show(sites.get( "w3codebox")) : ar.oldtoolbag.com
show(sites.get( "baidu")) : ?

طريقة getOrElse()

يمكنك استخدام طريقة getOrElse() للحصول على العنصر الموجود في التuple أو استخدام القيمة الافتراضية، مثل ما يلي:

object Test {
   def main(args: Array[String]) {
      val a:Option[Int] = Some(5)
      val b:Option[Int] = None
     
      println("a.getOrElse(0): " + a.getOrElse(0))
      println("b.getOrElse(10): " + b.getOrElse(10))
   }
}

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

$ scalac Test.scala 
$ scala Test
a.getOrElse(0): 5
b.getOrElse(10): 10

طريقة isEmpty()

يمكنك استخدام طريقة isEmpty() لتحديد ما إذا كان العنصر في التجميع هو None أم لا، مثل ما يلي:

object Test {
   def main(args: Array[String]) {
      val a:Option[Int] = Some(5)
      val b:Option[Int] = None
     
      println("a.isEmpty: " + a.isEmpty )
      println("b.isEmpty: " + b.isEmpty )
   }
}

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

$ scalac Test.scala 
$ scala Test
a.isEmpty: false
b.isEmpty: true

الطرق الشائعة لـ Scala Option

الجدول أدناه يوضح الطرق الشائعة لـ Scala Option:

الترتيب الطريقة والوصف
1

def get: A

الحصول على القيمة المحددة

2

def isEmpty: Boolean

التحقق من أن القيمة المحددة في الخيار هي None، إذا كانت كذلك يتم العودة بـ true، وإلا يتم العودة بـ false

3

def productArity: Int

العائد هو عدد العناصر، A(x_1, ..., x_k)، يتم العودة بـ k

4

def productElement(n: Int): Any

الحصول على الخيار المحدد، مع بدء من 0. أي A(x_1, ..., x_k)، يتم العودة بـ x_(n+1) حيث 0 < n < k.

5

def exists(p: (A) => Boolean): Boolean

إذا كان العنصر المحدد في الخيار موجودًا وغير None، يتم العودة بـ true، وإلا يتم العودة بـ false.

6

def filter(p: (A) => Boolean): Option[A]

إذا كان الخيار يحتوي على قيمة، ومن ثم يعود الحالة التي يتم تمريرها إلى filter كـ true، فإن filter سيعود بـ Some مثال. وإلا، فإن القيمة التي تعود هي None.

7

def filterNot(p: (A) => Boolean): Option[A]

إذا كان الخيار يحتوي على قيمة، ومن ثم يعود الحالة التي يتم تمريرها إلى filter كـ false، فإن filter سيعود بـ Some مثال. وإلا، فإن القيمة التي تعود هي None.

8

def flatMap[B](f: (A) => Option[B]): Option[B]

إذا كان الخيار يحتوي على قيمة، يتم نقل القيمة إلى وظيفة f ومعالجتها، وإلا يتم إرجاع None.

9

def foreach[U](f: (A) => U): Unit

إذا كان الخيار يحتوي على قيمة، يتم نقل كل قيمة إلى وظيفة f، وإلا يتم تجاهلها.

10

def getOrElse[B >: A](default: => B): B

إذا كان الخيار يحتوي على قيمة، يتم إرجاع قيمة الخيار، وإلا يتم إرجاع القيمة المحددة مسبقًا.

11

def isDefined: Boolean

إذا كان الخيار يحتوي على قيمة Some، يتم إرجاع true، وإلا يتم إرجاع false.

12

def iterator: Iterator[A]

إذا كان الخيار يحتوي على قيمة، يتم استدعاء قيمة الخيار. إذا كان الخيار فارغًا، يتم إرجاع محول فارغ.

13

def map[B](f: (A) => B): Option[B]

إذا كان الخيار يحتوي على قيمة، يتم إرجاع Some بعد معالجة وظيفة f، وإلا يتم إرجاع None.

14

def orElse[B >: A](alternative: => Option[B]): Option[B]

إذا كان الخيار None، فإن طريقة orElse ستعود إلى قيمة المعلمة المسمى، وإلا يتم إرجاع هذا الخيار.

15

def orNull

إذا كانت الخيار يحتوي على قيمة، يتم إرجاع قيمة الخيار، وإلا يتم إرجاع null.

جمعيات Scala