أسئلة المقابلة في Scala

قبل قراءة هذه المشاركة، يرجى الانتقال إلى المشاركة السابقة في “Scala Basic Interview Questions and Answers” للحصول على بعض المعرفة الأساسية حول لغة Scala. في هذه المشاركة، سنناقش بعض أسئلة المقابلة الشائعة في Scala التي تكون مفيدة لبعض مطوري Scala ذوي الخبرة. ملاحظة:- نظرًا لأن هذه القائمة أصبحت كبيرة جدًا بالفعل، سأقوم بنشر مشاركة أخرى تحتوي على الأسئلة والأجوبة المتبقية. يرجى الرجوع إلى تلك المشاركة في: “Scala Intermediate and Advanced Interview Questions and Answers”

أسئلة المقابلة في Scala

في هذا القسم، سنقوم بسرد جميع أسئلة المقابلة في Scala وفي القسم التالي سنناقشها بالتفصيل.

  1. ما هو المنشئ الأساسي؟ ما هو المنشئ الثانوي أو المساعد في Scala؟
  2. ما هي استخدامات المنشئات المساعدة في Scala؟ يرجى شرح القواعد التي يجب اتباعها في تحديد المنشئات المساعدة في Scala؟
  3. ما هي الفروق بين Array وArrayBuffer في Scala؟
  4. ما هي case class؟ ما هو case object؟ ما هي مزايا case class؟
  5. ما هو الفارق بين Case Object وObject (Normal Object)؟
  6. عندما يتم مقارنتها مع الفئة العادية، ما هي المزايا الرئيسية أو الفوائد للفئة المتناسقة؟
  7. ما هي استخدام طرق isInstanceOf وasInstanceOf في سكالا؟ هل هناك أي مفهوم مماثل متاح في جافا؟
  8. كيف تثبت أن الكائن المتناسق هو افتراضيًا قابل للتسلسل والكائن العادي ليس كذلك؟
  9. ما هو الفرق بين المصفوفة والقائمة في سكالا؟
  10. ما هو الفرق بين “val” و “lazy val” في سكالا؟ ما هو التقييم النشط؟ ما هو التقييم الكسول؟
  11. ما هي العلاقة بين طريقة equals و == في سكالا؟ اميز بين == في سكالا و == في جافا؟
  12. ما هو الفرق بين الفئة الداخلية في سكالا والفئة الداخلية في جافا؟
  13. ما هي مشكلة الألماس؟ كيف يحل سكالا مشكلة الألماس؟
  14. لماذا سكالا لا يحتوي على كلمة “static”؟ ما هو السبب الرئيسي لهذا القرار؟
  15. ما هو استخدام كلمة “object” في سكالا؟ كيفية إنشاء كائنات Singleton في سكالا؟
  16. كيفية تعريف طرق المصنع باستخدام كلمة “object” في سكالا؟ ما هو استخدام تعريف طرق المصنع في كائن؟
  17. ما هو الطريقة apply في سكالا؟ ما هو الطريقة unapply في سكالا؟ ما هو الفرق بين الطرق apply و unapply في سكالا؟
  18. كيف يعمل تحت الغطاء عند إنشاء مثيل لفئة دون استخدام كلمة “new” في سكالا؟ متى نذهب لهذا النهج؟
  19. كيف يمكننا تعريف مُنشئ أساسي خاص في سكالا؟ كيف نقوم بالاتصال بمُنشئ أساسي خاص في سكالا؟
  20. Translated text to Arabic:

    هل يمكن لكائن رفيق الوصول إلى الأعضاء الخاصة بفئته في سكالا؟

  21. ما هي القرارات التصميمية الرئيسية حول كلمتين منفصلتين: class و object في سكالا؟ كيف نقوم بتعريف أعضاء الفئة والأعضاء الثابتة في سكالا؟
  22. ما هو الكائن في سكالا؟ هل هو كائن فردي أم مثيل لفئة؟
  23. ما هو كائن الرفيق في سكالا؟ ما هي فئة الرفيق في سكالا؟ ما هو استخدام كائن الرفيق في سكالا؟
  24. كيفية تنفيذ الواجهات في سكالا؟
  25. ما هو النطاق في سكالا؟ كيفية إنشاء نطاق في سكالا؟
  26. كم قيمة لنوع Nothing في سكالا؟
  27. كم قيمة لنوع Unit في سكالا؟
  28. ما هو النطاق في سكالا؟ كيفية إنشاء نطاق في سكالا؟
  29. في برمجة الوظائف، ما الفارق بين الدالة والإجراء؟
  30. ما هي الفروق الرئيسية بين المنشئين الإضافيين في سكالا والمنشئين في جافا؟
  31. ما هو استخدام كلمة “yield” في هيكل التكرار في سكالا؟
  32. ما هو الحارس في هيكل التكرار في سكالا؟
  33. كيف تحل سكالا مشكلة الماسة التوريث بشكل تلقائي وبسهولة أكبر من جافا 8؟
  34. في سكالا، أي نمط تتبع المطابقة النمطية؟ في جافا، ما هو التشخيص ‘instanceof’ الذي يتبعه؟

أسئلة وأجوبة مقابلة سكالا

في هذا القسم، سنقوم بتقديم كل سؤال من القائمة أعلاه ومناقشته بالتفصيل مع أمثلة مناسبة (إذا لزم الأمر). إذا كنت ترغب في فهم هذه المفاهيم بعمق مع أمثلة، يرجى قراءة مشاركاتي السابقة في قسم دروس سكالا.

ما هو البناء الرئيسي؟ ما هو البناء الثانوي أو المساعد في سكالا؟ ما هو الغرض من البناء المساعد في سكالا؟ هل من الممكن تحميل البناء في سكالا؟

سكالا لديها نوعان من البناء:

  • البناء الرئيسي
  • البناء المساعد

البناء الرئيسي في سكالا، البناء الرئيسي هو بناء يتم تعريفه مع تعريف الفئة نفسها. يجب أن تحتوي كل فئة على بناء رئيسي واحد: إما بناء يأخذ معلمات أو بناء بدون معلمات. مثال:-

class Person

في الأعلى فئة الشخص لديها مُنشئ أساسي بارامتر صفري أو بدون مُعلمات لإنشاء مثيلات من هذه الفئة.

class Person (firstName: String, lastName: String)

في الأعلى فئة الشخص لديها مُنشئ أساسي بارامترين لإنشاء مثيلات من هذه الفئة. المُنشئ المُساعد المُنشئ المُساعد يُعرف أيضًا بالمُنشئ الثانوي. يمكننا تعريف مُنشئ ثانوي باستخدام الكلمات ‘def’ و ‘this’ كما هو موضح أدناه:

class Person (firstName: String, middleName:String, lastName: String){
  def this(firstName: String, lastName: String){
      this(firstName, "", lastName)
  }
}

ما هي استخدامات المُنشئات المُساعدة في سكالا؟ يُرجى شرح القواعد المطلوب اتباعها في تعريف المُنشئات المُساعدة في سكالا؟

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

  • هي مثل الطرق فقط. مثل الطرق، يجب علينا استخدام الكلمة ‘def’ لتعريفها.
  • يجب علينا استخدام نفس الاسم ‘this’ لجميع المُنشئات المُساعدة.
  • يجب أن تبدأ كل مُنشئ مُساعد بالاتصال بمُنشئ مُساعد مُعرف مسبقًا أو بالمُنشئ الأساسي. خلاف ذلك، سيتم عرض خطأ في وقت الترجمة.
  • يجب أن يختلف كل منشئ مساعد بقائمة معلماته: قد يكون بعددها أو أنواعها.
  • لا يمكن للمنشئات المساعدة استدعاء منشئات فئة الأساس. يجب أن يستدعوها عبر المنشئ الأساسي فقط.
  • جميع المنشئات المساعدة تستدعي المنشئ الأساسي إما مباشرة أو غير مباشرة من خلال المنشئات المساعدة الأخرى.

ملاحظة: –إذا كنت ترغب في التعرف على منشئات Scala ، يرجى الرجوع إلى مشاركاتي في Scala في: المنشئ الأساسي و المنشئ المساعد.

ما هي الاختلافات بين Array و ArrayBuffer في Scala؟

الاختلافات بين Array و ArrayBuffer في Scala:

  • Array هو مصفوفة ذات حجم ثابت. لا يمكننا تغيير حجمها بمجرد إنشائها.
  • ArrayBuffer هو مصفوفة ذات حجم متغير. يمكن زيادة أو تقليل حجمها بشكل ديناميكي.
  • Array مشابهة لمصفوفات Java الأساسية.
  • ArrayBuffer مشابهة لـ ArrayList في Java.

ما هي حالة الفئة؟ ما هو كائن الحالة؟ ما هي مزايا حالة الفئة؟

حالة الفئة هي فئة تم تعريفها بكلمات “case class”. كائن الحالة هو كائن تم تعريفه بكلمات “case object”. بسبب هذه الكلمة “case” ، سنحصل على بعض الفوائد لتجنب كود القالب. يمكننا إنشاء كائنات حالة الفئة دون استخدام كلمة “new”. بشكل افتراضي ، يضيف مترجم Scala “val” لجميع معلمات البناء. لهذا السبب ، بدون استخدام val أو var ، ستصبح معلمات بناء حالة الفئة أعضاء الفئة ، وهو أمر غير ممكن بالنسبة للفئات العادية. مزايا حالة الفئة:

  • بشكل افتراضي ، يضيف مترجم Scala toString و hashCode و equals methods. يمكننا تجنب كتابة هذا الكود القالبي.
  • بشكل افتراضي ، يضيف مترجم Scala كائن مصاحب بطرق apply و unapply ولهذا السبب لا نحتاج إلى كلمة new لإنشاء مثيلات لحالة الفئة.
  • بشكل افتراضي ، يضيف مترجم Scala أيضًا طريقة نسخ.
  • يمكننا استخدام فئات الحالة في مطابقة الأنماط.
  • بشكل افتراضي ، تكون فئة الحالة وكائنات الحالة قابلة للتسلسل.

ما الفرق بين كائن الحالة والكائن العادي؟

  • الكائن العادي يتم إنشاؤه باستخدام كلمة “object”. بشكل افتراضي، إنه كائن فردي.
object MyNormalObject
  • يتم إنشاء كائن الحالة باستخدام “case object” بشكل افتراضي، إنه أيضًا كائن فرديالكلمات الرئيسية.
case object MyCaseObject
  • بشكل افتراضي، يحصل كائن الحالة على أساليب toString و hashCode. لكن الكائن العادي لا يمكنه ذلك.
  • بشكل افتراضي، كائن الحالة قابل للتسلسل. لكن الكائن العادي ليس كذلك.

عند المقارنة بين الصنف العادي، ما هي المزايا الرئيسية أو الفوائد الرئيسية للصنف الحالة؟

إليكم أهم المزايا أو الفوائد الرئيسية لصنف الحالة مقارنة بالصنف العادي:

  • تجنب الكثير من الشفرة المكررة من خلال إضافة بعض الأساليب المفيدة تلقائياً.
  • بشكل افتراضي، يدعم عدم التغيير لأن معاملاته هي ‘val’
  • سهل الاستخدام في التطابق النمطي.
  • لا حاجة لاستخدام الكلمة الرئيسية ‘new’ لإنشاء مثيل من صنف الحالة.
  • بشكل افتراضي، يدعم التسلسل والإلغاء التسلسل.

ما هو استخدام طرق isInstanceOf وasInstanceOf في سكالا؟ هل هناك أي مفهوم مشابه متاح في جافا؟

كلا طرق isInstanceOf وasInstanceOf معرفة في فئة Any. لذلك لا حاجة لاستيرادها للحصول على هذه الطرق في أي فئة أو كائن. يُستخدم طريقة “isInstanceOf” لاختبار ما إذا كان الكائن من نوع معين أم لا. إذا كان كذلك، فإنها تعيد القيمة صحيحة. وإلا فإنها تعيد القيمة خاطئة.

   scala> val str = "Hello"
   
   scala>str.isInstanceOf[String]
   res0: Boolean = false   
 

تُستخدم طريقة “asInstanceOf” لتحويل الكائن إلى النوع المحدد. إذا كان الكائن المعطى والنوع متطابقين، فإنه يتم التحويل إلى النوع المعطى. وإلا، فإنه يتم إثارة استثناء java.lang.ClassCastException.

 scala> val str = "Hello".asInstanceOf[String]
 str: String = Hello
 

في جافا، كلمة “instanceof” مشابهة لطريقة “isInstanceOf” في سكالا. في جافا، يعتبر نوع التحويل اليدوي التالي مشابهًا لطريقة “asInstanceOf” في سكالا.

AccountService service = (AccountService)
 context.getBean("accountService");

كيف تثبت أن Case Object متسلسل بشكل افتراضي وأن Normal Object ليس كذلك؟

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

scala> object MyNormalObject
defined object MyNormalObject

scala> MyNormalObject.isInstanceOf[Serializable]
res0: Boolean = false

scala> case object MyCaseObject
defined object MyCaseObject

scala> MyCaseObject.isInstanceOf[Serializable]
res1: Boolean = true

ما الفرق بين المصفوفة والقائمة في سكالا؟

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

ملاحظة: – إذا لم تكن متأكدًا من الواقعية والتابعية ، يرجى قراءة مشاركتي التالية حول أسئلة مقابلة سكالا.

ما الفرق بين “val” و “lazy val” في سكالا؟ ما هي التقييم النشط؟ ما هو التقييم الكسول؟

كما تم مناقشته في أسئلة مقابلة سكالا الأساسية ، “val” يعني قيمة أو ثابت يُستخدم لتعريف المتغيرات غير القابلة للتعديل. هناك نوعان من تقييمات البرنامج:

  • تقييم حثيث
  • تقييم كسول

التقييم الحثيث يعني تقييم البرنامج في وقت الترجمة أو وقت نشر البرنامج بغض النظر عما إذا كان العملاء يستخدمون هذا البرنامج أم لا. التقييم الكسول يعني تقييم البرنامج في وقت التشغيل عند الطلب، وهذا يعني عندما يصل العملاء إلى البرنامج فقط يتم تقييمه. الفارق بين “val” و “lazy val” هو أن “val” يُستخدم لتعريف المتغيرات التي يتم تقييمها بحثاً و”lazy val” يُستخدم أيضاً لتعريف المتغيرات ولكن يتم تقييمها بشكل كسول.

ما هي العلاقة بين طريقة equals و == في سكالا؟ اميز بين == في سكالا و == في جافا؟

في سكالا، لا نحتاج إلى استدعاء طريقة equals() لمقارنة نسختين أو كائنين. عند مقارنة نسختين باستخدام ==، سكالا يستدعي تلقائياً طريقة equals() لهذا الكائن. يُستخدم مشغل == في جافا للتحقق من مساواة المراجع، أي ما إذا كانت اثنتان من المراجع تشيران إلى نفس الكائن أم لا. يُستخدم == في سكالا للتحقق من مساواة النسخ، أي ما إذا كانت نسختان متساويتان أم لا.

ما هو الفرق بين الفصل الداخلي في سكالا والفصل الداخلي في جافا؟

في جافا، يتم ربط الفصل الداخلي بالفصل الخارجي حيث يكون الفصل الداخلي عضوًا في الفصل الخارجي. على عكس جافا، تعامل سكالا بشكل مختلف مع العلاقة بين الفصل الخارجي والفصل الداخلي. يتم ربط الفصل الداخلي في سكالا بكائن الفصل الخارجي.

ما هي مشكلة الألماس؟ وكيف يحل سكالا مشكلة الألماس؟

A Diamond Problem is a Multiple Inheritance problem. Some people calls this problem as Deadly Diamond Problem. In Scala, it occurs when a Class extends more than one Traits which have same method definition as shown below. Unlike Java 8, Scala solves this diamond problem automatically by following some rules defined in Language. Those rules are called “Class Linearization”. Example:-

trait A{   
  def display(){ println("From A.display")  }
}
trait B extends A{ 
  override def display() { println("From B.display") }
}
trait C extends A{ 
  override def display() { println("From C.display") }
}
class D extends B with C{ }

object ScalaDiamonProblemTest extends App {
    val d = new D
    d display
}

هنا يكون الإخراج “من C.display” من الصفة C. مترجم سكالا يقرأ “extends B with C” من اليمين إلى اليسار ويأخذ تعريف طريقة “display” من أكثر الصفات يسارًا وهي C. ملاحظة:- انظر إلى مقالتي “سمات سكالا بالعمق” لمعرفة ذلك بشرح واضح.

لماذا لا تحتوي سكالا على الكلمة الأساسية “static”؟ ما هو السبب الرئيسي لهذا القرار؟

كما نعلم ، لا يحتوي Scala على كلمة “static” على الإطلاق. هذا هو قرار التصميم الذي اتخذته فريق Scala. السبب الرئيسي لاتخاذ هذا القرار هو جعل Scala كلغة برمجة نقية موجهة نحو الكائنات. يعني كلمة “static” أنه يمكننا الوصول إلى أعضاء الفئة تلك دون إنشاء كائن أو بدون استخدام كائن. هذا يتعارض تمامًا مع مبادئ البرمجة الموجهة نحو الكائنات. إذا دعمت لغة ما كلمة “static” ، فإن تلك اللغة ليست لغة برمجة نقية موجهة نحو الكائنات. على سبيل المثال ، بما أن Java تدعم كلمة “static” ، فإنها ليست لغة برمجة نقية موجهة نحو الكائنات. ولكن Scala هي لغة برمجة نقية موجهة نحو الكائنات.

ما هو استخدام كلمة “object” في Scala؟ كيفية إنشاء كائنات Singleton في Scala؟

في Scala ، تُستخدم كلمة object لأغراض التالية:

  • – تُستخدم لإنشاء كائن Singleton في Scala.
object MySingletonObject

هنا ، يصبح MySingletonObject كائن Singleton تلقائيًا.- تُستخدم كلمة object لتعريف تطبيقات Scala التي هي برامج Scala التي يمكن تنفيذها.

object MyScalaExecutableProgram{   
   def main(args: Array[String]){
       println("Hello World")
   }
}

عندما نعرف الطريقة الرئيسية في كائن كما هو موضح أعلاه (وهو نفس الطريقة main() في Java) ، يصبح تلقائيًا كبرنامج Scala يمكن تنفيذه.- تُستخدم لتعريف أعضاء ثابتة مثل المتغيرات الثابتة والطرق الثابتة دون استخدام كلمة ‘static’.

object MyScalaStaticMembers{ 
  val PI: Double = 3.1414  
  def add(a: Int, b: Int) = a + b
}

باستخدام المتغير PI وإضافة الأساليب، ستصبح كأعضاء ثابتة. هذا يعني أنه يمكننا استدعاؤها دون إنشاء كائن منفصل مثل MyScalaStaticMembers.add(10,20). – يتم استخدامها لتحديد طرق المصنع. يرجى الاطلاع على سؤالي التالي حول هذا.

كيفية تحديد طرق المصنع باستخدام كلمة المفتاح object في سكالا؟ ما الفائدة من تحديد طرق المصنع في كائن؟

في سكالا، نستخدم كلمة المفتاح ‘object’ لتحديد طرق المصنع. الغرض الرئيسي من هذه الطرق في سكالا هو تجنب استخدام كلمة ‘new’. بدون استخدام كلمة ‘new’ يمكننا إنشاء كائنات. لتحديد طرق المصنع: يمكننا استخدام طريقة apply لتحديد طرق المصنع في سكالا. إذا كان لدينا مُنشئ أساسي ومنشئات فرعية متعددة، فإنه يتعين علينا تحديد العديد من طرق apply كما هو موضح أدناه.

class Person(val firstName: String, val middleName: String, val lastName: String){
  def this(firstName: String, lastName: String){
    this(firstName,"",lastName)
  }
}
object Person{
  def apply(val firstName: String, val middleName: String, val lastName: String) 
        = new Person(firstName,middleName,lastName)

  def apply(val firstName: String, val lastName: String) 
        = new Person(firstName, lastName)
}

الآن يمكننا إنشاء كائنات Person دون استخدام كلمة new أو مع كلمة new حسب رغبتك.

val p1 = new Person("Scala","Java")
or 
val p1 = Person("Scala","Java")

ما هو الأسلوب apply في سكالا؟ ما هو الأسلوب unapply في سكالا؟ ما الفرق بين أساليب apply و unapply في سكالا؟

في سكالا، تلعب أساليب apply و unapply دورًا مهمًا للغاية. كما أنها مفيدة للغاية في إطار اللعب في تعيين وإلغاء تعيين البيانات بين بيانات النموذج وبيانات النموذج. ببساطة،

  • أسلوب apply: لتكوين أو تجميع كائن من مكوناته.
  • أسلوب unapply: لفك تركيب أو تفكيك كائن إلى مكوناته.

أسلوب apply في سكالا: يُستخدم لتكوين كائن باستخدام مكوناته. فلنفترض أننا نريد إنشاء كائن Person، ثم استخدم firstName و laststName مكونين وقم بتكوين كائن Person كما هو موضح أدناه.

class Person(val firstName: String, val lastName: String)

object Person{
  def apply(firstName: String, lastName: String) 
        = new Person(firstName, lastName)
}

أسلوب unapply في سكالا: يُستخدم لفك تركيب كائن إلى مكوناته. يتبع عملية عكسية لأسلوب apply. فلنفترض أن لدينا كائن Person، ثم يمكننا تفكيك هذا الكائن إلى مكونين: firstName و laststName كما هو موضح أدناه.

class Person(val firstName: String, val lastName: String)

object Person{
  def apply(firstName: String, lastName: String) 
        = new Person(firstName, lastName)

    def unapply(p: Person): (String,String) 
        = (p.firstName, p.lastName)
}

كيف يعمل تحت الغطاء، عند إنشاء مثيل من الفئة دون استخدام كلمة المفتاح ‘new’ في سكالا؟ متى نلجأ إلى هذا النهج؟ كيفية تعريف المُنشئات الخاصة في سكالا؟

في سكالا، عندما نقوم بإنشاء مثيل من الفئة دون استخدام كلمة المفتاح ‘new’، فإنه يقوم داخليًا بالاتصال بالطريقة apply المناسبة المتاحة في كائن الرفيق. الطريقة apply المناسبة هنا تعني أنها مُطابقة للمعلمات. متى نختار هذا الخيار: عندما نحتاج إلى توفير مُنشئ خاص ونحن بحاجة إلى تجنب استخدام كلمة المفتاح ‘new’، يمكننا تنفيذ طريقة apply فقط بنفس مجموعة المعلمات والسماح لمستخدمي الفئة بإنشائها بدون كلمة المفتاح ‘new’.

كيف يتم إعلان البناء الرئيسي الخاص في سكالا؟ كيف يمكننا استدعاء البناء الرئيسي الخاص في سكالا؟

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

class Person private (name: String)
object Person{
 def apply(name: String) = new Person(name)
}

نظرًا لأنه بناء خاص، لا يمكننا استدعائه من الخارج. يجب علينا توفير طريقة مصنعة (وهي طريقة التطبيق) كما هو موضح أعلاه واستخدام ذلك البناء بشكل غير مباشر.

هل يمكن لكائن Companion الوصول إلى الأعضاء الخاصة في فئته Companion في سكالا؟

بشكل عام، تعني الأعضاء الخاصة قابلية الوصول فقط داخل تلك الفئة. ومع ذلك، قدمت فئة Companion وكائن Companion ميزة أخرى. في سكالا، يمكن لكائن Companion الوصول إلى الأعضاء الخاصة في فئته Companion ويمكن لفئة Companion الوصول إلى الأعضاء الخاصة في كائنه Companion.

ما هي القرارات التصميمية الرئيسية حول كلمتين منفصلتين: class و object في سكالا؟ كيف نحدد أعضاء النسخة وأعضاء الثابت في سكالا؟

في سكالا، نستخدم كلمة class لتحديد أعضاء النسخة وكلمة object لتحديد أعضاء الثابت. سكالا لا تحتوي على كلمة static ، لكن لا يزال بإمكاننا تحديدها باستخدام كلمة object. القرار التصميمي الرئيسي حول هذا هو الفصل الواضح بين أعضاء النسخة وأعضاء الثابت. فصل فصل بينهما بشكل غير متشابك. والسبب الرئيسي الآخر هو تجنب كلمة static بحيث يصبح سكالا لغة برمجة محضة تتبع مفاهيم البرمجة الكائنية بشكل صرف.

ما هو object في سكالا؟ هل هو كائن مفرد أم نسخة من الفئة؟

على عكس جافا ، سكالا لها معنيان حول “object”. لا تحتار في هذا ، سأشرحه بوضوح. في جافا ، لدينا معنى واحد فقط لكلمة object وهو “نسخة من الفئة”.

  • مثل جافا ، المعنى الأول لكلمة object هو “نسخة من الفئة”.
val p1 = new Person("Scala","Java")
or 
val p1 = Person("Scala","Java")
  • تعني المعنى الثاني أن الكائن هو كلمة مفتاحية في سكالا. يُستخدم لتحديد برامج التنفيذ في سكالا، وكائنات الرفق، والكائنات الفردية، إلخ.

ما هو كائن الرفق في سكالا؟ ما هو فصيل الرفق في سكالا؟ ما هو استخدام كائن الرفق في سكالا؟

ببساطة، إذا كانت فئة سكالا وكائنها تحملان نفس الاسم وتم تعريفهما في نفس ملف المصدر، فإن تلك الفئة تعرف باسم “فئة الرفق” وتلك الكائن تعرف باسم “كائن الرفق”. عند إنشاء فئة باستخدام كلمة “class” في سكالا وكائن باستخدام كلمة “object” في سكالا بنفس الاسم وفي نفس ملف المصدر، تعرف تلك الفئة باسم “فئة الرفق” وتعرف تلك الكائن باسم “كائن الرفق”. مثال:- Employee.scala

class Employee{ }
object Employee{ }

في سكالا، الغرض الرئيسي من كائن الرفق هو تعريف طرق apply وتجنب استخدام الكلمة الرئيسية new في إنشاء مثيل لتلك الفئة المرافقة.

كيفية تنفيذ الواجهات في سكالا؟

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

ما هو النطاق في سكالا؟ كيف يمكن إنشاء نطاق في سكالا؟

النطاق هو مجموعة كسولة في سكالا. النطاق هو فئة متاحة في حزمة “سكالا” مثل “سكالا.نطاق”. يتم استخدامه لتمثيل سلسلة من قيم الأعداد الصحيحة. إنها سلسلة مرتبة من الأعداد الصحيحة. مثال:-

scala> 1 to 10
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> 1 until 10
res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

كم عدد قيم النوع Nothing المتوفرة في سكالا؟

في سكالا، النوع Nothing ليس لديه قيم، وهو عدد صفر. ليس لديه أي قيم. إنه نوع فرعي لجميع فئات القيم وفئات الإشارة.

كم عدد قيم النوع Unit المتوفرة في سكالا؟

في سكالا، يعتبر وحدة شيء مشابه لكلمة الفراغ في جافا. يتم استخدامها لتمثيل “لا توجد قيمة”. لديها قيمة واحدة وحيدة فقط وهي ().

ما هو الدالة النقية؟

A pure function is a function without any observable side-effects. That means it returns always same results irrespective how many times we call it with same inputs. A pure function always gives same output for the same inputs. For Example:-

scala> 10 + 20
res0: Int = 30
scala>
scala> 10 + 20
res0: Int = 30

هنا “+” دالة نقية متاحة في فئة Int. يعطي نفس النتيجة 30 للمدخلات نفسها 10 و 30، بغض النظر عن عدد مرات استدعائها.

في البرمجة الوظيفية، ما هو الفرق بين دالة وإجراء؟

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

ما هي الاختلافات الرئيسية بين المنشئات المساعدة في سكالا والمنشئات في جافا؟

المعين المساعد في سكالا مشابه تقريبًا للمعين المساعد في جافا مع بعض الاختلافات. بالمقارنة مع المعينات في جافا، المعينات المساعدة لها الاختلافات التالية:

  • يتم استدعاء المعينات المساعدة باستخدام الكلمة الأساسية “this”.
  • تم تعريف جميع المعينات المساعدة بنفس الاسم وهو “this”. في جافا، نستخدم اسم الفئة لتعريف المعينات.
  • يجب أن تبدأ كل معين مساعد بالاتصال بمعين مساعد تم تعريفه سابقًا أو المعين الأساسي.
  • نستخدم الكلمة الأساسية ‘def’ لتعريف المعاونين المساعدين مثل تعريف الطريقة / الوظيفة. في جافا ، تعريف المعين وتعريف الوظيفة مختلفان.

ما هو استخدام الكلمة الأساسية ‘yield’ في بناء الكومبريهنشن في سكالا؟

يمكننا استخدام الكلمة الأساسية ‘yield’ في بناء الكومبريهنشن في سكالا. يتم استخدام ‘for / yield’ لتكرار مجموعة من العناصر وتوليد مجموعة جديدة من نفس النوع. لا يتغير المجموعة الأصلية. يتم إنشاء مجموعة جديدة من نفس نوع المجموعة الأصلية. على سبيل المثال ، إذا استخدمنا بناء ‘for / yield’ لتكرار قائمة ، فإنه ينشئ قائمة جديدة فقط.

scala> val list = List(1,2,3,4,5)
list: List[Int] = List(1, 2, 3, 4, 5)

scala> for(l <- list) yield l*2
res0: List[Int] = List(2, 4, 6, 8, 10)

ما هو الحارس في هيكل الـ for-comprehension في سكالا؟

في سكالا، يحتوي هيكل for-comprehension على عبارة if تُستخدم لكتابة شرط يقوم بتصفية بعض العناصر وإنشاء مجموعة جديدة. تُعرف هذه العبارة if أيضًا باسم “الحارس”. إذا كان الحارس صحيحًا، يتم إضافة تلك العناصر إلى المجموعة الجديدة. وإلا، لا يتم إضافة تلك العناصر إلى المجموعة الأصلية. مثال:- حارس for-comprehension لإنشاء مجموعة جديدة تحتوي فقط على أرقام زوجية.

scala> val list = List(1,2,3,4,5,6,7,8,9,10)
list: List[Int] = List(1, 2, 3, 4, 5 , 6 , 7 , 8 , 9 , 10)

scala> for(l <- list if l % 2 =0 ) yield l
res0: List[Int] = List(2, 4, 6, 8, 10)

كيف تحل سكالا مشكلة الماسة في التوريث تلقائيًا وبسهولة أكبر من جافا 8؟

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

في سكالا، مطابقة الأنماط تتبع أي نمط تصميم؟ في جافا، يتبع عامل “isinstanceof” أي نمط تصميم؟

في سكالا، مطابقة الأنماط تتبع نمط تصميم الزائر. بنفس الطريقة، يتبع عامل “isinstanceof” في جافا أيضًا نمط تصميم الزائر. هذا هو كل شيء عن “أسئلة وأجوبة متوسطة في سكالا”. سنناقش بعض الأسئلة والأجوبة المتقدمة في سكالا في منشوراتي القادمة. يرجى ترك تعليق إذا أعجبك منشوري أو كان لديك أي مشاكل / اقتراحات.

Source:
https://www.digitalocean.com/community/tutorials/scala-interview-questions