Ruby / الأساسيات: القيم والطرق والنص والكائنات الصالحة / الدرس 2
كتابة الشروط وفق حقيقة Ruby ونتائج التعبيرات
استخدم شروطا صريحة ونتائج if و case وتكرارا محدودا وأسبقية منطقية واضحة لقواعد الأرشيف.
في هذه الصفحة
أهداف الدرس
- اشرح لماذا يعد الصفر والكائن الفارغ صحيحين شرطيا، بخلاف nil و false.
- اختر ترتيب الفروع ونهايتي المجال من السياسة الفعلية.
لا تكون كاذبة شرطيا إلا nil و false
تقبل شروط Ruby كائنات ولا تعد كاذبا إلا nil و false. الصفر والنص الفارغ والمصفوفة الفارغة صحيحة شرطيا، فلا يعني فحص العدد مباشرة أنه موجب أو فحص النص أنه ذو محتوى. اذكر الشرط بمقارنة أو فحص فراغ. يختلف ذلك عن لغات مألوفة وقد يغير قاعدة منقولة بصمت دون خطأ صياغة. افصل الغياب و false كإعداد مقصود والكمية الصفرية والمحتوى الفارغ عندما يحتاج المجال الفرق.
أظهر حد تفسير الحقيقة
يصنف السكربت قيما ثابتة دون طباعة تمثيل قد يربك القارئ. يختار التعبير الثلاثي تسمية وفق حقيقة الشرط، ولا يحول المجموعة الفارغة إلى false أو يتحقق من عناصرها. تنتهي طريقة شرطية عرفا بـ?، لكن الاسم لا يفرض true أو false وحدهما. صمّم المستدعي وفق عقد الرد الموثق. لم يُثبت مفسر Ruby في البيئة، فالتسميات نتائج متوقعة لا سجل تشغيل حقيقي.
[nil, false, 0, '', []].each do |value|
puts(value ? 'truthy' : 'falsey')
end
falsey
falsey
truthy
truthy
truthy
الأسطر المتوقعة falsey ثم falsey ثم truthy ثلاث مرات. يظل الفارغ والصفر كائنين موجودين. لم يُنفذ المصدر.
تعيد الفروع قيما إلى جانب توجيه التنفيذ
تكون if و unless و case تعبيرات، ويمكن لإسناد نتيجتها استبدال تعديلات متغير مؤقت. يحدد آخر تعبير مقيم قيمة الفرع، فقد يغير سجل مضاف نتيجة الطريقة عرضا. تُفحص elsif بالترتيب، وتستخدم case سلوك === لكل when، بما يدعم المجالات والأصناف لا المساواة البسيطة فقط. تجنب unless متداخلة بنفي متعدد؛ فالشرط الموجب المباشر أوضح كثيرا للمراجعة، خاصة مع أسباب رفض مختلفة.
ضع الحالات الضيقة قبل البدائل الأوسع
يعالج المثال السالب والصفر صراحة قبل مجال المجموعات الموجبة الصغيرة. يشمل 1..3 العدد ثلاثة، ويستبعده 1...3. المجال كائن بطرق ومطابقة، لا وعد بأن كل مدخل يقبل تكرارا مفيدا. استخدم each عندما تهم العناصر فقط، والفهرس عندما يهم الموضع. قد تعيد قراءة فهرس خارج المصفوفة nil، فيظهر الخطأ لاحقا كـ NoMethodError بدلا من استثناء حد فوري.
def count_label(count)
if count < 0
'invalid'
elsif count == 0
'empty'
else
case count
when 1..3 then 'small'
else 'large'
end
end
end
[-1, 0, 2, 4].each { |count| puts count_label(count) }
invalid
empty
small
large
المخرج المتوقع invalid ثم empty ثم small ثم large. لا تصل القيم السالبة لتصنيف المجال. لم يُنفذ السكربت المستقل.
اختر العمليات المنطقية لتجميع واضح
تختلف أسبقية && و|| عن الكلمتين and و or منخفضتي الأسبقية. قد يغير جمع الإسناد معهما القيمة المسندة رغم تشابه التعبير. فضّل الأقواس أو if منفصلة عند غموض التجميع. وتستبدل ||= قيمة false قائمة أيضا، فلا تعني عموما التهيئة عند الغياب فقط. للإعداد المنطقي ذي false المقصودة افحص غياب المفتاح أو nil صراحة. افهم الاختصار قبل وضع أثر جانبي على طرف عامل منطقي.
الأخطاء الشائعة وإصلاحها
يقبل فحص يفترض الإيجابية العدد صفر.
- لماذا يحدث؟
- فُحصت حقيقة الكائن بدلا من count > 0.
- كيف تصلحه؟
- اكتب شرط المجال صراحة.
- كيف تتجنب تكراره؟
- اختبر السالب والصفر والموجب منفصلة.
يستبدل افتراضي إعداد false محفوظا.
- لماذا يحدث؟
- دمجت ||= القيمة false بالغياب.
- كيف تصلحه؟
- افحص nil أو وجود المفتاح وفق عقد الإعداد.
- كيف تتجنب تكراره؟
- أدرج false كقيمة إعداد مقصودة في الفحوص.
تبدأ طريقة بإعادة نتيجة سجل بعد تعديل صغير.
- لماذا يحدث؟
- تغير آخر تعبير مقيم.
- كيف تصلحه؟
- صرّح بالرد المقصود أو أعد موضعه الأخير.
- كيف تتجنب تكراره؟
- راجع الرد عند إضافة آثار للفروع التعبيرية.
اختبر فهمك
1. لماذا لا يكفي if title لاشتراط عنوان غير فارغ؟
اعرض الحل المشروح
النص الفارغ صحيح شرطيا وقد يمر كائن غير نصي. تحقق من النوع والمحتوى ومنها قبول المسافات وحدها. ميّز الغائب والفارغ عند الحاجة لأسباب مختلفة. لا تغني حقيقة Ruby المرنة عن حد تحقق دلالي.
2. ما حالات الحدود التي تميز 1..3 من 1...3 في التصنيف؟
اعرض الحل المشروح
يشمل الأول ثلاثة فقط. افحص الواحد والاثنين والثلاثة وقيمة مجاورة خارجية لتوثيق النهاية. لا تستنتج السياسة من قيم بعيدة عن الحد. يصح اختصار المجال عندما تطابق شموليتُه المطلب.
أهم ما تعلمته
- الحقيقة والفراغ وصحة المجال أسئلة مختلفة.
- تؤثر نتائج الفروع والمطابقة وأسبقية العمليات في السلوك المرصود.