الدرس 9 من 10

دمج الوحدات في الأصناف

هدف الدرس

دمج Comparable بـ include والعامل <=>

01

الشرح

الوحدة (module) مجموعة دوال لا تُنشئ منها كائنات، بل تدمجها في الأصناف، فكتابة include Comparable داخل الصنف تضيف إليه دوال الوحدة كأنك كتبتها فيه بنفسك. وبهذا تشترك أصناف لا علاقة بينها في سلوك واحد دون وراثة.

وتطلب منك Comparable دالة واحدة هي <=>، تُرجع عددًا سالبًا إذا كان الكائن أصغر من الآخر، وصفرًا إذا تساويا، وعددًا موجبًا إذا كان أكبر، وتعطيك مقابلها < و> و== وbetween? وclamp. وتعتمد sort وmax على <=> نفسها.

وخذ مثالًا حقيقيًّا هو أرقام الإصدارات، فإذا قارنتها نصوصًا قورنت حرفًا حرفًا، فتكون "3.10.0" < "3.9.2" صحيحة لأنّ الحرف "1" يأتي قبل "9"، وتختار max على النصوص "3.9.2" وليس "3.10.0". لذلك حوّلها إلى أرقام أوّلًا، لأنّ المصفوفات تُقارن بـ <=> عنصرًا عنصرًا، فـ [3, 10, 0] <=> [3, 9, 2] تعطي 1.

02

المطلوب

عرّف صنف Version الذي يُنشأ من نصّ مثل Version.new("3.10.0")، وادمج فيه Comparable، وعرّف فيه <=> لتقارن أجزاء الإصدار أرقامًا، وto_s لتُرجع النصّ بالشكل نفسه. ثم اجعل latest أحدث إصدار في releases، على أن يكون كائنًا من Version.

الفحوص

6 فحوص
  1. الوحدة Comparable مدموجة في الصنف Version
  2. الإصدار 3.10.0 أحدث من 3.9.2 لأنّ المقارنة بالأرقام
  3. المقارنة == تأتي من Comparable، والإصداران المتطابقان متساويان
  4. الدالة between? تتحقّق أنّ الإصدار بين حدّين
  5. الدالة sort ترتّب بالأرقام، والدالة to_s تُرجع النصّ
  6. قيمة latest هي 3.10.0 وليس 3.9.2
main.rb
المخرجاتRuby 3.4 (ruby.wasm)

نحمّل بيئة Ruby الآن، وحجمها نحو 8 ميغابايت. يحدث هذا مرّة واحدة فقط، ثم يحفظها متصفّحك.

–/6

يبدأ الفحص حين تجهز البيئة.

تجد 6 فحوص في بطاقة «المطلوب».