محتويات الدورة
Ruby
الأساسيات: القيم والطرق والنص والكائنات الصالحة
العقود: الاستدعاء والتقييم والإخفاق ونماذج القيم
التكامل: البيانات والموارد وأدلة التنفيذ والثقة

Ruby / الأساسيات: القيم والطرق والنص والكائنات الصالحة / الدرس 3

تصميم عقود الطرق والكلمات المفتاحية والكتل

استخدم أدوار معاملات صريحة والرد الضمني وتمرير الكلمات المفتاحية و yield وأعراف التعديل دون افتراضات خفية.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • ميّز المعاملات الموضعية والكلمات المفتاحية والكتلة الممررة في Ruby 3.3.
  • اشرح الرد والأثر الجانبي كجزء من عقد الكائن القابل للاستدعاء.

أظهر أدوار المعاملات عند الاستدعاء

تقبل طرق Ruby معاملات موضعية مطلوبة أو اختيارية وكلمات مفتاحية وبقية معاملات وكتلة. قد تكون id: مطلوبة وتوفر copies: 1 افتراضيا. تفصل Ruby 3 الكلمات المفتاحية عن Hash موضعية أخيرة في حالات مهمة للاستدعاء والتمرير. استخدم ** عند تمرير بيانات مفتاحية عمدا، لا تحويلات قديمة ضمنية. تجنب استقبال بقية واسع يقبل خيارا مكتوبا خطأ بصمت. يوضح التوقيع المطلوب، وتبقى الأنواع الديناميكية محتاجة تحققا دلاليا عند الحد المناسب.

استخدم الأسماء دون إخفاء قيمة الرد

تعيد طريقة التسمية تعبير الاستيفاء الأخير. تقع puts خارج الطريقة لإتاحة القيمة دون طباعة. يمكن أن يكون الافتراضي تعبيرا يُقيّم عند إغفال المعامل، وليس بالضرورة كائنا مخصصا مرة مشتركا للأبد. ومع ذلك، إذا أعادت الطريقة كائنا قابلا للتعديل مرّره المستدعي أو خزّنته، فقد تظل تشاركه معه. وثّق هل تستعير الطريقة أو تنسخ أو تعدل. يستخدم المثال نصوصا وأعدادا ثابتة فقط، ويعرض مخرجا متوقعا لغياب مفسر Ruby.

ruby كلمات مفتاحية مطلوبة واختيارية بتمرير صريح
def record_label(id:, copies: 1)
  "#{id}:#{copies}"
end
options = {id: 'A-7', copies: 2}
puts record_label(id: 'A-6')
puts record_label(**options)
الناتج المتوقع
A-6:1
A-7:2

المخرج المتوقع A-6:1 ثم A-7:2. تُوسع Hash الخيارات ككلمات مفتاحية. السكربت مستقل وغير منفذ.

تزود الكتلة سلوكا وفق بروتوكول الطريقة

تستدعي الطريقة الكتلة المعطاة باستخدام yield، وتميز block_given? غيابها. حدّد هل الكتلة إلزامية أو اختيارية وهل تستدعى مرة أو لكل عنصر؛ إذ يؤثر ذلك في الآثار والاستثناءات. قد يفشل yield دون كتلة، فتحتاج الاختيارية بديلا معلنا. ليست الكتلة مهمة خلفية تلقائيا؛ يستدعيها yield ضمن التدفق الحالي. تميز الدروس اللاحقة الكتل و Proc و lambda لاختلاف معاملات وعودة مؤثر.

اجعل القيمة الممررة والنتيجة مقصودتين

يحسب المساعد تسمية محلية مطبّعة، ثم يعيدها أو يعيد تحويل الكتلة لها. لا يعدّل نص المدخل. تستقبل الكتلة معاملا واحدا، ويصبح آخر تعبير فيها نتيجة المساعد في ذلك الفرع. قد تغير puts تشخيصية أخيرة النتيجة إلى nil. يفيد السلوك كعقد معلن ويفاجئ إذا وعدت الطريقة بالأصل دائما. افصل مساعد التحويل عن مساعد مراقبة يحافظ على الكائن المستقبِل مهما أعاد الاستدعاء الراجع.

ruby كتلة تحويل متزامنة اختيارية
def with_label(text)
  value = text.strip.upcase
  return value unless block_given?
  yield value
end
puts with_label(' archive ')
puts with_label(' archive ') { |label| "[#{label}]" }
الناتج المتوقع
ARCHIVE
[ARCHIVE]

المخرج المتوقع ARCHIVE ثم [ARCHIVE]. تعمل الكتلة متزامنة وتحدد النتيجة الثانية. لا يُدعى اختبار تشغيل.

تنقل الأسماء أعرافا لا فرضا آليا

تشير ? عرفا لطريقة شرطية، وتحذر ! كثيرا من بديل أخطر أو قد يعدّل الكائن. لا تعني ! التعديل دائما ولا يضمن غيابها الصفاء. ولأسماء طرق الإسناد دلالات استدعاء ينبغي قراءتها لا استنتاجها من الدوال العادية. حدّد الخطأ والتعديل والرد صراحة. فضّل طريقة صغيرة ذات مسؤولية مسماة دون خيارات كثيرة؛ فقد تنقل التواقيع المفرطة المرونة الخطأ لفروع لاحقة مبهمة بدلا من منعه.

الأخطاء الشائعة وإصلاحها

لا تُعامل Hash ممررة كالكلمات المفتاحية المطلوبة.

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

يعيد مساعد nil بعد إضافة سطر سجل.

لماذا يحدث؟
أصبحت puts آخر تعبير بدلا من القيمة المطلوبة.
كيف تصلحه؟
أعد القيمة صراحة أو أبقها التعبير الأخير.
كيف تتجنب تكراره؟
راجع عقود الرد عند تغييرات الرصد.

يفشل yield عند عدم تمرير كتلة.

لماذا يحدث؟
افترض التنفيذ كتلة إلزامية دون توثيق أو فحص.
كيف تصلحه؟
اشترط الكتلة بوضوح أو قدم بديلا عبر block_given?.
كيف تتجنب تكراره؟
اختبر مساري وجود الكتلة وغيابها منفصلين.

اختبر فهمك

1. هل تعدّل كل طريقة ينتهي اسمها بـ! الكائن الذي تُستدعى عليه؟

اعرض الحل المشروح

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

2. لماذا تُترك puts خارج record_label؟

اعرض الحل المشروح

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

أهم ما تعلمته

  • تشكل أدوار المعاملات واستدعاء الكتلة والتعديل والرد عقد الطريقة.
  • تساعد أعراف Ruby القارئ ولا تستبدل ضمانات السلوك الصريحة.

المراجع الرسمية