0Pricing
Scala for Backend Engineering & Functional Programming · درس

الدوال كقيم من الدرجة الأولى

تعلّم تعريف الدوال وتمريرها كوسائط، وإرجاعها من دوال أخرى، وتخزينها في المتغيرات

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

الدوال كقيم من الدرجة الأولى

مرحبًا بكم في أساسيات البرمجة الوظيفية! في Scala، الدوال ليست مجرد أوامر؛ بل هي قيم من الدرجة الأولى.

وهذا يعني أنه يمكنكم التعامل مع الدوال مثل أي نوع بيانات آخر، كالأعداد أو السلاسل النصية. وهذا مفهوم أساسي في البرمجة الوظيفية!

إسناد الدوال إلى المتغيرات

تمامًا كما يمكنكم إسناد عدد إلى val، يمكنكم إسناد دالة إليه. هنا يصبح greet متغيرًا يحتفظ بدالتنا.

جرّبوا تشغيل هذا المثال البسيط:

object Main {
  def main(args: Array[String]): Unit = {
    val greet = (name: String) => s"Hello, $name!"
    println(greet("Alice"))
  }
}

الدوال المجهولة (لامبدا)

الجزء (name: String) => s"Hello, $name!" في المشهد السابق هو دالة مجهولة، وتُعرف أيضًا باسم تعبير لامبدا.

إنها دالة بلا اسم، وغالبًا ما تُعرّف مباشرةً في الموضع الذي تحتاجون إليها فيه. وهي مفيدة جدًا للمهام السريعة والمحددة.

object Main {
  def main(args: Array[String]): Unit = {
    val add = (x: Int, y: Int) => x + y
    println(s"5 + 3 = ${add(5, 3)}")

    val subtract = (a: Int, b: Int) => a - b
    println(s"10 - 4 = ${subtract(10, 4)}")
  }
}

الدوال كمعاملات للأساليب

من أقوى الجوانب تمرير الدوال كمعاملات إلى دوال أخرى. وتُسمّى هذه الدوال عالية الرتبة.

تأخذ الدالة applyOperation أدناه عددين ودالة أخرى هي op. ثم تُستخدم op لدمج العددين.

object Main {
  def applyOperation(x: Int, y: Int, op: (Int, Int) => Int): Int = {
    op(x, y)
  }

  def main(args: Array[String]): Unit = {
    val add = (a: Int, b: Int) => a + b
    val result = applyOperation(5, 3, add)
    println(s"Result of addition: $result")
  }
}

فهم أنواع الدوال

لاحظوا توقيع النوع op: (Int, Int) => Int في المشهد السابق.

  • (Int, Int): يعني أن الدالة تأخذ معاملين من النوع Int.
  • => Int: يعني أن الدالة تُرجع قيمة من النوع Int.

لكل دالة نوع يصف مدخلاتها ومخرجاتها. وهذا يساعد Scala على ضمان أمان الأنواع!

تمرير الدوال بإيجاز

لا تحتاجون دائمًا إلى تعريف دالة مسمّاة أولًا. يمكنكم تمرير دالة مجهولة مباشرةً حيث يُتوقع وجود معامل دالة.

يجعل هذا الشيفرة أكثر اختصارًا وأسهل قراءة، لا سيما في العمليات البسيطة.

object Main {
  def applyOperation(x: Int, y: Int, op: (Int, Int) => Int): Int = {
    op(x, y)
  }

  def main(args: Array[String]): Unit = {
    val result1 = applyOperation(10, 2, (a: Int, b: Int) => a * b)
    println(s"Multiplication: $result1")

    // Scala can often infer types, making it even shorter!
    val result2 = applyOperation(20, 4, (a, b) => a / b)
    println(s"Division: $result2")
  }
}

الدوال كقيم مُرجعة

يمكن للدوال أيضًا إرجاع دوال أخرى. قد يبدو هذا غريبًا، لكنه مفيد جدًا لإنشاء شيفرة مرنة قابلة للتهيئة.

هنا تُرجع makeMultiplier دالة جديدة تضرب مدخلها في عامل محدد.

object Main {
  def makeMultiplier(factor: Int): Int => Int = {
    (x: Int) => x * factor
  }

  def main(args: Array[String]): Unit = {
    val multiplyByTwo = makeMultiplier(2)
    val multiplyByFive = makeMultiplier(5)

    println(s"5 * 2 = ${multiplyByTwo(5)}")
    println(s"10 * 5 = ${multiplyByFive(10)}")
  }
}

فهم الإغلاقات

عندما تُرجع makeMultiplier دالة، تتذكر الدالة المُرجعة قيمة factor وقت إنشائها. ويُسمّى هذا إغلاقًا.

حتى بعد انتهاء تنفيذ makeMultiplier، تظل الدالة multiplyByTwo «تعرف» أن عاملها يساوي 2.

فوائد الدوال من الدرجة الأولى

لماذا يُعد التعامل مع الدوال باعتبارها قيمًا من الدرجة الأولى أمرًا مهمًا؟

  • المرونة: يمكنكم تبديل السلوكيات بسهولة بتمرير دوال مختلفة.
  • إعادة الاستخدام: ابنوا دوال عامة تعمل مع أي دالة تقدمونها.
  • الإيجاز: يؤدي ذلك إلى شيفرة أقصر وأكثر تعبيرًا، لا سيما مع الدوال المجهولة.
  • الأسلوب الوظيفي: يُعد هذا ركيزة للبرمجة الوظيفية، ويمكّن من استخدام أنماط قوية.

اختبروا معلوماتكم

لنتحقق من فهمكم للدوال باعتبارها قيمًا من الدرجة الأولى.

object Main {
  def execute(x: Int, op: Int => Int): Int = op(x)

  def main(args: Array[String]): Unit = {
    val square = (n: Int) => n * n
    val result = execute(5, square)
    println(result)
  }
}

الدوال كقيم: مراجعة

أحسنتم! لقد تعلّمتم المفهوم الأساسي المتمثل في الدوال كقيم من الدرجة الأولى في Scala.

  • يمكن إسناد الدوال إلى المتغيرات.
  • يمكن تمريرها كمعاملات إلى دوال أخرى.
  • يمكن إرجاعها كنتائج من دوال أخرى.
  • يتيح هذا أنماطًا قوية مثل الدوال عالية الرتبة والإغلاقات.

تُعد هذه القدرة أساسية لكتابة شيفرة Scala وظيفية مرنة وقابلة لإعادة الاستخدام وتعبيرية. بعد ذلك، سنتعمق في الدوال عالية الرتبة الأكثر تقدمًا والتطبيق الجزئي!

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

هل درس «الدوال كقيم من الدرجة الأولى» مجاني؟

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

ماذا ستتعلم في «الدوال كقيم من الدرجة الأولى»؟

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

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

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

كم من الوقت يستغرق درس «الدوال كقيم من الدرجة الأولى»؟

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

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

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

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

  1. الدوال كقيم من الدرجة الأولى
  2. الدوال عالية الرتبة والتطبيق الجزئي
  3. عدم القابلية للتغيير والآثار الجانبية
← العودة إلى Scala for Backend Engineering & Functional Programming