الصدق والكذب في روبي (Truthiness & Falsiness)
هل تعلم أن روبي تختلف عن معظم لغات البرمجة في تحديد ما هو "صادق" وما هو "كاذب"؟ في هذا الدرس، سنتعلم مفهوماً مهماً جداً يؤثر على كيفية كتابة الشروط.
ما المقصود بـ Truthiness و Falsiness؟
عندما نستخدم قيمة في شرط (مثل if)، روبي تحتاج أن تقرر: هل هذه القيمة تُعتبر صادقة (truthy) أم كاذبة (falsy)؟
الناتج:
القاعدة الذهبية في روبي
في روبي، فقط
nilوfalseتُعتبران كاذبتين (falsy). كل شيء آخر صادق (truthy)!
هذه القاعدة بسيطة جداً وتجعل روبي مختلفة عن لغات مثل JavaScript أو Python.
القيم الكاذبة (Falsy Values)
في روبي، هناك فقط قيمتان كاذبتان:
1. القيمة false
الناتج:
2. القيمة nil
الناتج:
القيم الصادقة (Truthy Values)
كل شيء آخر في روبي يُعتبر صادقاً! حتى القيم التي قد تتوقع أنها كاذبة:
الرقم صفر (0) صادق!
الناتج:
مهم: في لغات مثل JavaScript و C، الرقم 0 يُعتبر كاذباً. لكن في روبي، 0 صادق!
النص الفارغ ("") صادق!
الناتج:
مهم: في Python و JavaScript، النص الفارغ
""يُعتبر كاذباً. لكن في روبي، هو صادق!
المصفوفة الفارغة ([]) صادقة!
الناتج:
القاموس الفارغ ({}) صادق!
الناتج:
جدول مقارنة الصدق والكذب
| القيمة | الصدق/الكذب | ملاحظة |
|---|---|---|
false | ❌ كاذبة | القيمة المنطقية false |
nil | ❌ كاذبة | غياب القيمة |
true | ✅ صادقة | القيمة المنطقية true |
0 | ✅ صادقة | مختلف عن لغات أخرى! |
"" | ✅ صادقة | النص الفارغ صادق |
" " | ✅ صادقة | نص يحتوي مسافة |
[] | ✅ صادقة | مصفوفة فارغة |
{} | ✅ صادقة | قاموس فارغ |
1 | ✅ صادقة | أي رقم غير صفر |
-1 | ✅ صادقة | الأرقام السالبة أيضاً |
"hello" | ✅ صادقة | أي نص |
التحقق باستخدام !! (Double Bang)
يمكنك استخدام !! لتحويل أي قيمة إلى قيمة منطقية حقيقية (true أو false):
الناتج:
كيف يعمل !!؟
!الأول يعكس القيمة (truthy تصبحfalse، falsy تصبحtrue)!الثاني يعكسها مرة أخرى (للحصول على القيمة المنطقية الصحيحة)
الناتج:
أمثلة عملية
التحقق من وجود قيمة
الناتج:
التحقق من متغير قد يكون nil
الناتج:
التعامل مع نتائج البحث
الناتج:
الفرق بين nil و false
رغم أن كلاهما كاذب، إلا أنهما مختلفان:
الناتج:
nilيعني "غياب القيمة" أو "لا شيء"falseيعني "لا" أو "خاطئ" بشكل صريح
التحقق من القيم الفارغة
إذا أردت التحقق من أن نصاً أو مصفوفة فارغة، استخدم empty?:
الناتج:
التحقق الآمن باستخدام &.
الناتج:
(الناتج فارغ لأن nil&.empty? يُرجع nil والذي يُطبع كسطر فارغ)
مقارنة روبي مع لغات أخرى
| القيمة | روبي | JavaScript | Python |
|---|---|---|---|
0 | ✅ صادق | ❌ كاذب | ❌ كاذب |
"" | ✅ صادق | ❌ كاذب | ❌ كاذب |
[] | ✅ صادق | ❌ كاذب* | ❌ كاذب |
{} | ✅ صادق | ❌ كاذب* | ❌ كاذب |
nil/null/None | ❌ كاذب | ❌ كاذب | ❌ كاذب |
false/False | ❌ كاذب | ❌ كاذب | ❌ كاذب |
*في JavaScript، المصفوفات والكائنات الفارغة صادقة، لكن عند المقارنة تتصرف بشكل معقد.
تذكّر: روبي أبسط! فقط
nilوfalseكاذبتان.
نصائح مهمة
-
لا تقارن بـ true أو false صراحةً عادةً:
-
استخدم
nil?للتحقق من nil تحديداً: -
استخدم
empty?للتحقق من الفراغ: -
استخدم
||للقيم الافتراضية:
تمرين: التنبؤ بالصدق والكذب
حان وقت التطبيق! في محرر الشيفرة على اليسار:
المطلوب:
استخدم !! لتحويل القيم التالية إلى قيم منطقية واطبع النتيجة:
falsenil0""[]"روبي"
الناتج المتوقع:
تلميح: استخدم
puts !!valueلكل قيمة. تذكر أن فقطnilوfalseهما الكاذبتان!
تذكّر: قاعدة روبي البسيطة: فقط
nilوfalseكاذبتان. كل شيء آخر صادق! هذا يجعل كتابة الشروط أسهل وأكثر قابلية للتنبؤ.