دوال الامتداد
إضافة دوال إلى الأنواع
دوال الامتداد درس مجاني في 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 دروس في المجموع.
إضافة دوال إلى الأنواع الموجودة
تتيح لكم دوال الامتداد إضافة دوال جديدة إلى نوع لا تملكونه، مثل Int أو String، من دون تعديل مصدره. ويوفّر Scala 3 صياغة واضحة لذلك.
object Main:
extension (x: Int)
def squared: Int = x * x
def main(args: Array[String]): Unit =
println(5.squared)صياغة الامتداد
اكتبوا extension (param: Type) ثم تعريف دالة واحدة أو أكثر. داخل كل دالة، يشير المُعامل إلى قيمة الكائن المُستقبِل.
object Main:
extension (s: String)
def shout: String = s.toUpperCase + "!"
def main(args: Array[String]): Unit =
println("hello".shout)دوال متعددة في كتلة واحدة
يمكن لعبارة extension واحدة تعريف عدة دوال تعمل جميعها على النوع نفسه للكائن المُستقبِل.
object Main:
extension (x: Int)
def squared: Int = x * x
def cubed: Int = x * x * x
def isEven: Boolean = x % 2 == 0
def main(args: Array[String]): Unit =
println(4.squared)
println(3.cubed)
println(6.isEven)دوال الامتداد ذات المُعاملات
يمكن لدوال الامتداد استقبال مُعاملاتها الخاصة، بالإضافة إلى الكائن المُستقبِل.
object Main:
extension (x: Int)
def times(s: String): String = s * x
def main(args: Array[String]): Unit =
println(3.times("ab"))دوال الامتداد العامة
يمكن أن تكون الامتدادات عامة، فتضيف دوال إلى عائلة كاملة من الأنواع مثل List[A].
object Main:
extension [A](xs: List[A])
def second: A = xs(1)
def main(args: Array[String]): Unit =
println(List(10, 20, 30).second)
println(List("a", "b").second)لماذا تتفوق الامتدادات على التحويلات الضمنية
تحقق دوال الامتداد الهدف القديم المتمثل في «pimp-my-library» بأمان أكبر: فهي تضيف الدوال المسماة فقط، من دون خطر إجراء تحويلات صامتة للأنواع في مواضع أخرى.
object Main:
extension (d: Double)
def percentOf(total: Double): Double = d / total * 100
def main(args: Array[String]): Unit =
println(25.0.percentOf(200.0))الامتدادات وفئات الأنواع
تتكامل دوال الامتداد بشكل رائع مع فئات الأنواع: عرّفوا السلوك عبر مثيل given وأظهروه كدالة باستخدام using.
trait Show[A]:
def show(a: A): String
object Main:
given Show[Int] with
def show(a: Int): String = s"<$a>"
extension [A](a: A)
def display(using s: Show[A]): String = s.show(a)
def main(args: Array[String]): Unit =
println(42.display)تعريف المعاملات
بما أن المعاملات ليست سوى دوال، يمكن للامتدادات إضافة معاملات رمزية إلى الأنواع الموجودة أيضًا.
object Main:
extension (x: Int)
def **(exp: Int): Int = math.pow(x, exp).toInt
def main(args: Array[String]): Unit =
println(2 ** 10)النطاق والاستيرادات
لا تتوفر دوال الامتداد إلا في المواضع التي تكون فيها ضمن النطاق. عرّفوها داخل كائن واستوردوه لاستخدامها، وبذلك تحافظون على التحكم في نطاق انتشارها.
object StringOps:
extension (s: String)
def reversedWords: String = s.split(" ").reverse.mkString(" ")
object Main:
import StringOps._
def main(args: Array[String]): Unit =
println("hello there world".reversedWords)تسلسل دوال الامتداد
تعيد دوال الامتداد قيمًا عادية، لذا يمكنكم تسلسلها مع الدوال المضمّنة لإنشاء مسارات استدعاء سلسة.
object Main:
extension (s: String)
def emphasize: String = s"*$s*"
def main(args: Array[String]): Unit =
println("scala".toUpperCase.emphasize)أداة مساعدة عملية
تُعد دوال الامتداد مثالية للأدوات المساعدة الصغيرة الخاصة بالمجال، إذ تجعل الشيفرة المستدعية تبدو طبيعية عند قراءتها.
object Main:
extension (n: Int)
def isPrime: Boolean =
n > 1 && (2 until n).forall(d => n % d != 0)
def main(args: Array[String]): Unit =
println((2 to 12).filter(_.isPrime).toList)تحقق سريع
ما الميزة الأساسية لدوال الامتداد في Scala 3 مقارنةً بالتحويلات الضمنية عند إضافة الدوال؟
مراجعة
لقد تعلّمتم دوال الامتداد:
- تضيف
extension (x: Type) def ...دوال إلى الأنواع الموجودة - يمكن لكتلة واحدة تعريف عدة دوال، بما في ذلك المعاملات
- يمكن أن تكون عامة وأن تستقبل مُعاملات
- تتكامل طبيعيًا مع فئات الأنواع عبر
using - هي أكثر أمانًا من التحويلات الضمنية، ويجب استيرادها إلى النطاق
الأسئلة الشائعة
هل درس «دوال الامتداد» مجاني؟
نعم — نص درس «دوال الامتداد» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «دوال الامتداد»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.