الدوال كقيم
دوال من الدرجة الأولى
الدوال كقيم درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
الدوال قيم
في Scala، تُعدّ الدوال قيمًا من الدرجة الأولى. يمكنكم تخزينها في متغيرات، وتمريرها كوسيطات، وإعادتها من دوال أخرى، تمامًا مثل الأعداد أو السلاسل النصية.
object Main {
def main(args: Array[String]): Unit = {
val increment: Int => Int = x => x + 1
println(increment(5))
}
}صيغة نوع الدالة
يعني النوع Int => String أن الدالة تأخذ قيمة من النوع Int وتُعيد قيمة من النوع String. وتُستخدم الأقواس للوسيطات المتعددة: (Int, Int) => Int.
object Main {
def main(args: Array[String]): Unit = {
val add: (Int, Int) => Int = (a, b) => a + b
val label: Int => String = n => s"value=$n"
println(add(3, 4))
println(label(7))
}
}صيغة Lambda (الدالة المجهولة)
تُكتب الدالة المجهولة، أو lambda، بالصيغة (params) => body. ولا يكون لها اسم، وغالبًا ما تُمرَّر مباشرةً إلى دالة أخرى.
object Main {
def main(args: Array[String]): Unit = {
val square = (x: Int) => x * x
println(square(6))
}
}الدوال عالية الرتبة
الدالة عالية الرتبة هي دالة تأخذ دالةً كمعلمة أو تُعيد دالة. وتُعدّ map وfilter مثالين شائعين عليها.
object Main {
def applyTwice(f: Int => Int, x: Int): Int = f(f(x))
def main(args: Array[String]): Unit = {
println(applyTwice(_ + 3, 10))
}
}تمرير الدوال إلى الأساليب
تقبل أساليب المجموعات الدوال. ويمكنكم تمرير lambda مضمنة أو تمرير قيمة دالة مسمّاة.
object Main {
def main(args: Array[String]): Unit = {
val triple = (x: Int) => x * 3
println(List(1, 2, 3).map(triple))
println(List(1, 2, 3).map(x => x * 3))
}
}إعادة الدوال
يمكن للدالة أن تُعيد دالة أخرى. تعيد multiplier هنا دالة تضرب في عامل ثابت، وبذلك تكون مصنعًا صغيرًا للدوال.
object Main {
def multiplier(factor: Int): Int => Int = x => x * factor
def main(args: Array[String]): Unit = {
val timesTen = multiplier(10)
println(timesTen(5))
}
}الأساليب مقابل الدوال
يعرّف def أسلوبًا. ويمكنكم تحويل الأسلوب إلى قيمة دالة باستخدام الشرطة السفلية لتوسعة eta: methodName _، أو بمجرد استخدامه في موضع يُتوقَّع فيه وجود دالة.
object Main {
def doubleIt(x: Int): Int = x * 2
def main(args: Array[String]): Unit = {
val f: Int => Int = doubleIt
println(f(8))
println(List(1, 2, 3).map(doubleIt))
}
}الدوال دون معلمات
يمكن للدالة ألا تأخذ أي وسيطات. ويُكتب نوعها () => T. وهذا مفيد لتأجيل التنفيذ.
object Main {
def main(args: Array[String]): Unit = {
val greeting: () => String = () => "Hello!"
println(greeting())
}
}تخزين الدوال في المجموعات
بما أن الدوال قيم، يمكنكم تخزينها في القوائم أو الخرائط والبحث عنها ديناميكيًا، لإنشاء موزّع أوامر صغير.
object Main {
def main(args: Array[String]): Unit = {
val ops: Map[String, (Int, Int) => Int] = Map(
"add" -> (_ + _),
"mul" -> (_ * _)
)
println(ops("add")(3, 4))
println(ops("mul")(3, 4))
}
}الدوال بوصفها إعدادات
يسمح تمرير دالة للمتصلين بتخصيص السلوك. تطبّق transformAll العامة هنا أي دالة على عناصر قائمة.
object Main {
def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
def main(args: Array[String]): Unit = {
println(transformAll(List(1, 2, 3), _ + 100))
println(transformAll(List(1, 2, 3), _ * 10))
}
}مثال أوضح على التخصيص
إليكم الفكرة نفسها بصياغة أوضح: يوفّر المتصلون التحويل، مما يحافظ على عمومية المساعد وقابليته لإعادة الاستخدام.
object Main {
def transformAll(xs: List[Int], f: Int => Int): List[Int] = xs.map(f)
def main(args: Array[String]): Unit = {
println(transformAll(List(1, 2, 3), x => x + 100))
println(transformAll(List(1, 2, 3), x => x * x))
}
}اختبار سريع
ما الدالة عالية الرتبة؟
مراجعة
لقد تعلّمتم أن الدوال قيم من الدرجة الأولى:
- تخزين الدوال في
valوالقوائم والخرائط - أنواع الدوال مثل
Int => String - Lambda:
(x) => bodyوالصيغة المختصرة_ - الدوال عالية الرتبة تأخذ دوالًا أو تُعيدها
- تتحول الأساليب إلى قيم دوال عبر توسعة eta
الأسئلة الشائعة
هل درس «الدوال كقيم» مجاني؟
نعم — نص درس «الدوال كقيم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «الدوال كقيم»؟
دوال من الدرجة الأولى تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الدوال كقيم»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.