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

استنتاج النوع

دع المترجم يستنتج الأنواع

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

ما الاستدلال على النوع؟

تستخدم Scala نظام أنواع ثابتًا، ومع ذلك نادرًا ما تضطر إلى كتابة الأنواع صراحةً. إذ يستدل المترجم عليها من القيمة الموجودة في الجانب الأيمن.

ويمنحك هذا أمان الأنواع مع إيجاز اللغات الديناميكية.

val n = 42        // inferred Int
val label = "hi" // inferred String

الاستدلال من القيم الحرفية

عندما تكتب val x = 5، يرى المترجم القيمة الحرفية Int ويمنح x النوع Int.

وتصبح القيمة الحرفية العشرية من نوع Double، بينما يصبح النص الموضوع بين علامتي اقتباس من نوع String.

object Main extends App {
  val count = 5
  val ratio = 1.5
  println(count + ratio)
}

الاستدلال على قيم إرجاع الدوال

يمكن للمترجم أيضًا استنتاج نوع الإرجاع للأسلوب من جسمه.

يعيد square هنا قيمة من نوع Int لأن جسمه يضرب قيمتين من نوع Int. ولم تكن بحاجة إلى التصريح بذلك.

object Main extends App {
  def square(x: Int) = x * x
  println(square(6))
}

تظل المعاملات بحاجة إلى أنواع

للاستدلال حدود. يجب تحديد نوع معاملات الأساليب، لأن المترجم لا يملك ما يستنتجها منه.

لن يُترجم المقطع أدناه من دون : Int على x.

def increment(x: Int) = x + 1 // type on x is required

النوع المشترك المستنتج

عندما يمكن أن تكون القيم من عدة أنواع، تستنتج Scala النوع المشترك الأكثر تحديدًا.

يؤدي مزج Int وDouble في العمليات الحسابية إلى توسيع النتيجة لتصبح من نوع Double.

object Main extends App {
  val mixed = 3 + 2.0  // Double
  println(mixed)
}

الاستدلال في المجموعات

تستنتج المجموعات نوع عناصرها من القيم التي تضعها فيها.

فتصبح قائمة الأعداد الصحيحة List[Int] تلقائيًا، وتحافظ بذلك على أمان الأنواع الكامل من دون تحديد الأنواع صراحةً.

object Main extends App {
  val nums = List(1, 2, 3) // List[Int]
  println(nums.sum)
}

متى يفاجئك الاستدلال

يختار الاستدلال أحيانًا نوعًا أوسع مما تريد. فقد تستنتج قائمة الأعداد المختلطة List[Double] أو حتى List[AnyVal].

إذا لم يكن النوع المستنتج مناسبًا لاحتياجاتك، فأضف تحديدًا صريحًا للنوع.

val a = List(1, 2.0)        // List[Double]
val b = List(1, "two")     // List[Any]

تجاوز الاستدلال بالتحديدات

يمكنك دائمًا التصريح صراحةً. فتحديد النوع يوثق قصدك، ويتجاوز أيضًا استدلالًا أضيق مما ينبغي.

تُوسّع القيمة الحرفية 7 هنا عمدًا لتصبح من نوع Long.

val seconds: Long = 7
val data: List[Int] = List(1, 2, 3)

واجهات API العامة: صرّح صراحةً

قاعدة أسلوب شائعة: دع الاستدلال يتولى قيم val المحلية، لكن اكتب أنواع الإرجاع صراحةً في الأساليب العامة.

يحافظ هذا على استقرار عقد مكتبتك حتى إذا تغيّر التنفيذ.

def total(items: List[Int]): Int = items.sum

يحافظ الاستدلال على أمان الأنواع

لا يضعف الاستدلال نظام الأنواع. فما زال المترجم يرفض العمليات غير الصحيحة.

يستنتج المترجم أدناه أن name من نوع String، ولذلك تفشل محاولة ضربه في عدد عند الترجمة، كما ينبغي تمامًا.

val name = "Lia"
val bad = name * 3 // error: value * is not a member of String in this sense

يبقى val المستنتج غير قابل للتغيير

يملأ الاستدلال النوع فقط، ولا يغيّر قابلية الارتباط للتغيير.

يبقى val n = 10 غير قابل للتغيير وثابتًا من نوع Int؛ لقد وفّر عليك المترجم ببساطة كتابة : Int.

object Main extends App {
  val n = 10 // inferred Int, still a val
  println(n * n)
}

اختبار سريع

أين تظل Scala تتطلب منك كتابة النوع؟

مراجعة

يتيح استنتاج الأنواع لـ Scala أن تبقى موجزة من دون التضحية بالأمان الساكن.

  • عادةً ما تُستنتج أنواع val المحلية وأنواع القيم المُعادة تلقائيًا.
  • يجب تحديد أنواع معلمات الأساليب صراحةً.
  • يختار الاستنتاج النوع المشترك الأكثر تحديدًا.
  • حدّد النوع صراحةً في واجهات برمجة التطبيقات العامة أو لتجاوز استنتاج غير متوقع.

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

هل درس «استنتاج النوع» مجاني؟

نعم — نص درس «استنتاج النوع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

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

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

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

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

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

  1. val مقابل var
  2. الأنواع الأساسية والقيم الحرفية
  3. استنتاج النوع
  4. التعبيرات بدلًا من العبارات
← العودة إلى Scala for Backend Engineering & Functional Programming