Ruby / العقود: الاستدعاء والتقييم والإخفاق ونماذج القيم / الدرس 12
مطابقة البيانات المركبة دون المبالغة في التحقق
استخدم case/in وأنماط النوع والخريطة والحراس والتثبيت وسياسة عدم تطابق صريحة وفق Ruby 3.3 المختارة.
في هذه الصفحة
أهداف الدرس
- ميّز تطابق النمط البنيوي من التحقق الدلالي الكامل والتفويض.
- اشرح الربط مقابل التثبيت والمطابقة الشرطية مقابل الإلزامية.
يفحص النمط الشروط التي يعبّر عنها فقط
تفحص الأنماط البنى وتربط أجزاءها. تختلف case/in عن case/when ولا تخلطان فروعهما في case واحدة. تستخدم أنماط الأنواع عقد مطابقتها ويضيف الحارس شرطا بعد التطابق. يتوقع نمط Hash بـ id: مفاتيح رمزية، ولا يكافئ JSON نصي المفاتيح تلقائيا. ترجم الخارج عمدا ولا تغير المفاتيح عمياء. يوضح النمط البنية وتبقى النصوص الفارغة والمعرفات الممنوعة والنطاقات بحاجة تحقق منفصل.
أضف سياسة صريحة للشكل المطابق
يربط المثال معرف String وعدد Integer ثم يشترط الإيجابية. يسمح النمط بالمفاتيح الزائدة، فلا يرفض extra. استخدم نمطا مغلقا مناسبا ومنها **nil حيث ينطبق إذا وجب رفض المجهول. لا يتحقق المصدر من الصيغة أو الملكية. تمثل Ruby 3.3 المرجع المختار لا وعد كل مفسر أقدم. النجاح المعروض نتيجة محلية محللة؛ ولم يُنفذ محرك أنماط أو تكامل خارجي.
value = {id: 'A-9', copies: 2, extra: 'ignored'}
case value
in {id: String => id, copies: Integer => copies} if copies > 0
puts "#{id}:#{copies}"
else
puts 'invalid shape or count'
end
A-9:2
المخرج المتوقع A-9:2. يفحص الحارس الإيجابية والنمط النوعين المعلنين، ولا يرفض الزائد عمدا. لم يُنفذ السكربت.
ثبّت قيمة قائمة بدلا من إعادة ربطها
يربط موضع متغير عادي في النمط بيانات، ولا يقارن تلقائيا بمحلي سابق بالاسم نفسه. يطلب ^ استخدام قيمة قائمة للمطابقة. يهم ذلك لاختيار سجل معين بدلا من قبول أي معرف واستبداله. أبق المتغيرات التي تحتاج نجاح التطابق داخل الفرع الناجح. لا تعتمد على روابط جزئية تركها نمط معقد فاشل؛ فقد يجعل ذلك التدفق هشا ويخفي الدليل الذي أثبت القيمة.
حدّد المعرف الذي تحفظه المقارنة
يتطلب نمط المصفوفة عنصرين ويقارن الأول بـ expected عبر التثبيت ويلتقط Integer في الثاني. تعالج else عدم المطابقة دون استثناء. هذه سياسة ترشيح لا تحقق استيراد كامل؛ ويحفظ المنتج سبب رفض إذا لزم ناتج لكل سجل. قد ترمي => كإسناد يميني أو case/in دون else مناسبة NoMatchingPatternError. اختر الشرطي أو الإلزامي بحسب كون الاختلاف متوقعا أو خرقا لقيد داخلي موثوق.
expected = 'A-7'
[['A-7', 2], ['B-8', 3]].each do |record|
case record
in [^expected, Integer => copies]
puts "match:#{copies}"
else
puts 'skip'
end
end
match:2
skip
المخرج المتوقع match:2 ثم skip. تبقى expected قيمة المقارنة المختارة. لم يُنفذ مفسر أو مسار استيراد.
التفكيك المخصص سلوك قابل للتنفيذ
يمكن للكائن توفير deconstruct و deconstruct_keys. قد تعمل هذه الطرق أو تكشف مراجع معدلة، فلا يضمن النمط الصفاء أو حد الكلفة أو الملكية الآمنة. اجعل التفكيك متوقعا وتجنب أثرا يعتمد على عدد محاولات المطابقة. تحقق عند الحد قبل منح سلطة فعلية. افحص الأشكال والمفاتيح والزائد والحارس والتثبيت والرفض معزولا. تسجل الدورة تحليل مصدر دون دليل مطابقة منفذ.
الأخطاء الشائعة وإصلاحها
يربط ما يفترض مقارنة معرفا جديدا بصمت.
- لماذا يحدث؟
- استُخدم نمط متغير دون تثبيت القيمة القائمة.
- كيف تصلحه؟
- استخدم ^ لمقارنة القيمة القائمة المقصودة.
- كيف تتجنب تكراره؟
- افحص دور الربط والمقارنة صراحة في النمط.
تفشل خريطة خارجية نصية المفاتيح مع نمط رمزي.
- لماذا يحدث؟
- تغير عقد المفتاح البنيوي عند الفك.
- كيف تصلحه؟
- تحقق وترجم المخطط الخارجي قبل المطابقة الداخلية.
- كيف تتجنب تكراره؟
- أدرج أنواع المفاتيح المفكوكة الفعلية في الأمثلة.
يرمي مدخل خاطئ عادي NoMatchingPatternError على غير المتوقع.
- لماذا يحدث؟
- استُخدمت مطابقة إلزامية حيث الاختلاف نتيجة عادية.
- كيف تصلحه؟
- قدّم مسار رفض شرطي صريحا.
- كيف تتجنب تكراره؟
- افصل تحقق غير الموثوق عن تفكيك داخلي موثوق.
اختبر فهمك
1. هل تثبت مطابقة {id: String, copies: Integer} أمرا صالحا للأرشيف؟
اعرض الحل المشروح
لا. تفحص الشكل والأصناف المعلنة فقط. قد يكون المعرف فارغا أو غائبا أو غير مأذون، ويخالف العدد نطاقا أو حالة. وقد يبقى الزائد مقبولا دون إغلاق الشكل. افصل الفك والبنية والتحقق الدلالي والتفويض كحدود أدلة.
2. متى يناسب الرمي عند عدم تطابق النمط؟
اعرض الحل المشروح
عندما يثبت العقد شكلا موثوقا ويعني الاختلاف خرق قيد برمجي. للمتغير الخارجي العادي تكون نتيجة خطأ صريحة أوضح عادة. وثّق السلوك وافحص المطابق وغير المطابق. لا يبرر قصر الإسناد اليميني تحويل الرفض المعتاد إلى انهيار مفاجئ.
أهم ما تعلمته
- تكشف الأنماط فحوصا بنيوية محددة لا ثقة كاملة.
- يحمل الربط والتثبيت والحارس وسياسة الاختلاف معاني مستقلة.