Scala for Backend Engineering & Functional Programming · درس

Option في for-comprehensions

تسلسل الخيارات

الدرس 4 من 413 خطوة

Option في for-comprehensions درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

تسلسل Options بوضوح

قد يصعب قراءة عدة استدعاءات flatMap وmap متسلسلة. يوفر for-comprehension في Scala صياغة أوضح للشيء نفسه.

إنها صياغة مختصرة يعيد المترجم كتابتها إلى استدعاءات flatMap وmap.

‏for-comprehension أساسي

داخل for { ... } yield ...، يستخرج كل x <- option القيمة إذا كانت موجودة. وتبني yield النتيجة النهائية.

إذا كانت كل Options من النوع Some، فستحصل على Some تحتوي على النتيجة.

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(3)
    val b: Option[Int] = Some(4)
    val sum = for {
      x <- a
      y <- b
    } yield x + y
    println(sum)
  }
}

التوقف المبكر عند None

إذا كان أي مولّد يساوي None، فستُرجع البنية كاملةً None. ويتم تخطي الخطوات المتبقية.

هذا هو التوقف المبكر نفسه الذي يوفره flatMap، لكن بصيغة أسهل قراءة.

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(3)
    val b: Option[Int] = None
    val sum = for {
      x <- a
      y <- b
    } yield x + y
    println(sum)
  }
}

كيفية إزالة الصياغة المختصرة

يعيد المترجم كتابة for-comprehension إلى flatMap وmap. هذان المقطعان متكافئان.

يساعدك فهم ذلك على توقّع نوع النتيجة.

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(3)
    val b: Option[Int] = Some(4)
    val viaFor = for { x <- a; y <- b } yield x + y
    val viaFlatMap = a.flatMap(x => b.map(y => x + y))
    println(viaFor)
    println(viaFlatMap)
  }
}

استخدام القيم السابقة

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

object Main {
  def main(args: Array[String]): Unit = {
    val base: Option[Int] = Some(10)
    val result = for {
      x <- base
      y <- Some(x * 2)
    } yield x + y
    println(result)
  }
}

الارتباطات الوسيطة

يمكنك تقديم قيم عادية داخل البنية باستخدام = (من دون سهم). وهذا مفيد للحسابات الوسيطة.

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(6)
    val result = for {
      x <- a
      doubled = x * 2
    } yield doubled + 1
    println(result)
  }
}

الحواجز باستخدام if

يمكن أن تتضمن البنية عامل تصفية باستخدام if. وإذا لم يتحقق الشرط، تصبح النتيجة None.

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(8)
    val even = for {
      x <- a
      if x % 2 == 0
    } yield x
    println(even)
    val b: Option[Int] = Some(7)
    println(for { x <- b if x % 2 == 0 } yield x)
  }
}

دمج عمليات البحث

استخدام شائع: البحث عن عدة مفاتيح ودمجها فقط إذا كانت جميعها موجودة.

object Main {
  val data = Map("a" -> 1, "b" -> 2)
  def main(args: Array[String]): Unit = {
    val combined = for {
      x <- data.get("a")
      y <- data.get("b")
    } yield x + y
    println(combined)
    val missing = for {
      x <- data.get("a")
      z <- data.get("c")
    } yield x + z
    println(missing)
  }
}

لماذا نستخدم for-comprehensions؟

إنها توفر لك ما يلي:

  • تسلسلًا واضحًا لـ Options المعتمدة على بعضها
  • توقفًا مبكرًا تلقائيًا عند None
  • القوة نفسها التي يوفرها flatMap/map، لكن بصيغة أبسط
  • التصفية باستخدام if والارتباطات الوسيطة باستخدام =

الوصول إلى قيمة

تُرجع البنية Option، لذا اختتم باستخدام getOrElse أو fold للحصول على قيمة عادية.

object Main {
  def main(args: Array[String]): Unit = {
    val a: Option[Int] = Some(3)
    val b: Option[Int] = Some(4)
    val total = (for { x <- a; y <- b } yield x + y).getOrElse(0)
    println(total)
  }
}

جمع الأجزاء معًا

مسار كامل: تحليل مدخلين، والتحقق من شرط، ودمجهما، وتوفير قيمة افتراضية.

object Main {
  def parse(s: String): Option[Int] = s.toIntOption
  def main(args: Array[String]): Unit = {
    val result = for {
      x <- parse("10")
      y <- parse("5")
      if y != 0
    } yield x / y
    println(result.getOrElse(-1))
  }
}

تحقق سريع

اختبر مدى فهمك لـ for-comprehensions على Option.

مراجعة

تعلمت كيفية تسلسل Options باستخدام for-comprehensions:

  • for { x <- a; y <- b } yield ... يسلسل Options بطريقة واضحة
  • تُزال صيغته المختصرة إلى flatMap/map
  • تؤدي أي None إلى إيقاف النتيجة كاملةً عند None
  • يمكن للمولّدات اللاحقة استخدام القيم السابقة؛ وتضيف = الارتباطات، بينما تُجري if التصفية
  • اختتم باستخدام getOrElse أو fold للحصول على قيمة عادية
البدء مجانًا

تعلم Scala مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
39
الدروس
143

الأسئلة الشائعة

هل درس «Option في for-comprehensions» مجاني؟

نعم — نص درس «Option في for-comprehensions» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

ماذا ستتعلم في «Option في for-comprehensions»؟

تسلسل الخيارات تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟

لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «Option في for-comprehensions»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟

نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تجنب null
  2. map وflatMap على Option
  3. getOrElse وfold
  4. Option في for-comprehensions
← العودة إلى Scala for Backend Engineering & Functional Programming