Ruby / الأساسيات: القيم والطرق والنص والكائنات الصالحة / الدرس 5
استخدام المصفوفات والخرائط دون إخفاء البيانات الغائبة
اختر البحث الموضعي أو بالمفتاح ودلالة fetch ومفاتيح Symbol و String والافتراضيات المستقلة والنسخ السطحي المقصود.
في هذه الصفحة
أهداف الدرس
- ميّز الغياب من nil أو false الموجودة عند الوصول للمجموعة.
- تجنب كائنات افتراضية قابلة للتعديل ومشتركة واشرح عمق النسخ.
اختر علاقة البيانات لا مجرد صيغة مريحة
Array تسلسل مفهرس مرتب قد يحتوي أصنافا مختلفة وتكرارا، وتربط Hash مفاتيح فريدة بقيّم وتحفظ ترتيب المرور الموثق. اختر الأولى لمعنى التسلسل والثانية للربط. لا يتحقق أي منهما تلقائيا من نوع المحتوى أو مجاله. تختلف مفاتيح Symbol عن String، فقد تختلف خريطة JSON مفكوكة وخيارات رمزية مكتوبة رغم تشابه العرض. طبّع المفاتيح بسياسة حد مقصودة ولا تجرّب كل تهجئة عبر التطبيق.
استخدم fetch عندما يجب إظهار الغياب
قد يعيد بحث أقواس Array و Hash قيمة nil عند غياب موضع أو مفتاح. إذا سمح التخزين بـ nil فلا تميز النتيجة وحدها الغياب. تفحص key? الوجود، وترمي fetch للغائب أو تستخدم افتراضيا أو كتلة. تحسب كتلة fetch البديل عند الحاجة فقط، بخلاف تعبير المعامل المقيم قبل الاستدعاء. احفظ false المقصودة ولا تستبدلها عرضا بـ||. يفصل المثال false موجودة ومفتاحا رمزيا غائبا ومفتاح String مختلفا.
settings = {enabled: false, 'name' => 'Archive'}
puts settings.fetch(:enabled)
puts settings.fetch(:name, 'missing symbol')
puts settings.fetch('name')
puts settings.key?(:enabled)
puts settings.key?(:unknown)
false
missing symbol
Archive
true
false
المخرج المتوقع false ثم missing symbol ثم Archive ثم true ثم false. لا يشير :name الرمزي إلى مفتاح String المسمى name. لم يُنفذ المصدر.
قد يصبح الكائن الافتراضي حالة مشتركة عرضا
تعيد Hash.new([]) المصفوفة الافتراضية نفسها للمفاتيح الغائبة ولا تخزن واحدة مستقلة لكل مفتاح تلقائيا. قد يؤثر تعديلها في كل بحث غائب. وتكرر Array.new(3, mutable_object) مرجعا واحدا لا ثلاثة كائنات مستقلة. استخدم كتلة لإنشاء قيم منفصلة عند قصدها. ولمجموعات Hash تستطيع كتلة الافتراضي إسناد مصفوفة جديدة للمفتاح الغائب. هذا تعديل مقصود ينبغي توثيقه إذا أنشأت القراءة مدخلات.
امنح كل مجموعة حاويتها
تنشئ الكتلة أدناه مصفوفة لأول وصول لكل فئة، فتبقى سجلات A و B في حاويتين منفصلتين. المثال تتبع محلي بتسميات اصطناعية لا تجميع قاعدة أو خريطة متزامنة. لا يوفر هذا بروتوكول تهيئة آمنا بين خيوط تصل للخريطة نفسها. أظهر الملكية واستخدم حد المزامنة المناسب للمشاركة. ويحتفظ النسخ السطحي بمراجع الداخل؛ فلا تضمن الحاوية الخارجية المستقلة استقلال محتوى السجل القابل للتعديل داخلها.
groups = Hash.new { |hash, key| hash[key] = [] }
groups['A'] << 'record-1'
groups['B'] << 'record-2'
puts groups['A'].join(',')
puts groups['B'].join(',')
puts groups['A'].equal?(groups['B'])
record-1
record-2
false
المخرج المتوقع record-1 ثم record-2 ثم false. يملك المفتاحان كائني مصفوفة مختلفين. لم يُنفذ مفسر أو اختبار تزامن.
أظهر تعديل المجموعة وسياسة الغياب
قد يخضع الحذف والإدراج أثناء المرور لقيود الطريقة ونتائج مفاجئة؛ فضّل بناء نتيجة أو تحويلا موثقا. تعيد بعض bang قيمة nil عند عدم التغيير، فلا تفترض أن كل ترشيح يعيد مصفوفة. حوّل المفقود لرفض أو نتيجة اختيارية لا معرف مخترع. افحص الفراغ والغياب وتكرر المفتاح و false و nil وتعديل الداخل معزولا. تصف الدورة الفحوص ولا تسجل تنفيذ مجموعات Ruby أو نقل بيانات أو استعادة تشغيلية.
الأخطاء الشائعة وإصلاحها
تبدو المفاتيح الغائبة مشتركة في مصفوفة تكبر.
- لماذا يحدث؟
- قُدم كائن قابل للتعديل كقيمة افتراضية مشتركة.
- كيف تصلحه؟
- أنشئ وأسند حاوية مستقلة بكتلة افتراضية.
- كيف تتجنب تكراره؟
- افحص مفتاحين غائبين وهوية حاويتيهما.
يفشل بحث Symbol في حقل مفتاحه String.
- لماذا يحدث؟
- تغير تمثيل المفتاح عند حد الإدخال.
- كيف تصلحه؟
- تحقق وترجم مخطط المفاتيح مرة عند الحد.
- كيف تتجنب تكراره؟
- ميّز الخيارات الداخلية والسجلات الخارجية المفكوكة صراحة.
يُعد إعداد false غائبا.
- لماذا يحدث؟
- استبدل بديل قائم على الحقيقة قيمة مخزنة مشروعة.
- كيف تصلحه؟
- استخدم الوجود أو fetch وفق العقد المعلن.
- كيف تتجنب تكراره؟
- أدرج false و nil مستقلتين في فحوص البحث.
اختبر فهمك
1. لماذا لا يعزل نسخ Hash مصفوفاتها الداخلية تلقائيا؟
اعرض الحل المشروح
ينشئ النسخ السطحي غلافا آخر ويحتفظ بمراجع القيم، فيُرى تعديل مصفوفة داخلية عبر الخريطتين. حدّد العمق والهوية المطلوبة واختر قيما ثابتة أو سياسة نسخ. لا يحل تجميد الغلاف المنسوخ مشاركة العناصر.
2. متى تُفضّل fetch على الأقواس لحقل أرشيف مطلوب؟
اعرض الحل المشروح
عندما يجب أن ينتج الغياب فشلا واضحا أو بديلا محسوبا صراحة لا nil صامتة. تحقق أيضا من نوع القيمة ومجالها؛ فقد توجد nil أو نص مشوه مع وجود المفتاح. حدّد هل يُعامل غياب المدخل كنتيجة تحقق متوقعة أم كسوء استخدام للواجهة من المستدعي، قبل ترجمة الفشل.
أهم ما تعلمته
- الوجود والقيمة ونوع المفتاح والافتراضي قرارات بحث مختلفة.
- قد تشترك الحاويات المستقلة في قيم داخلية قابلة للتعديل.