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

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

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

ميّز التعديل ونتائج bang دون تغيير والبايت والمحرف ومطابقة النص كله والتحليل الصارم والمتسامح.

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

أهداف الدرس

  • تجنب ربط نتيجة طريقة تعدّل String باستدعاء آخر عندما يمكن أن تعيد nil عند عدم التغيير.
  • تحقق من صيغة المدخل كاملة قبل اعتبار المحوّل موثوقا.

يحوي النص بايتات مرتبطة بترميز

تمثل String نصا أو بيانات ثنائية وتحمل ترميزا. تقيس bytesize البايتات، وتعتمد length على تفسير المحارف ولا تعد كل وحدة يدركها المستخدم عموما. وسم الترميز وصحة البايت والتطبيع أمور منفصلة. لا تقطع بايتات اعتباطيا وتفترض صحة النص. يستخدم الدرس ASCII ثابتا عاديا دون ادعاء سياسة لكل اللغات. وللنص الخارجي أعلن الترميزات المقبولة ومعالجة التشوه وحدود الحجم قبل البحث والتحليل والعرض.

اقرأ التعديل ومعنى الرد معا

قد تختلف طرق النص المتشابهة بالتعديل والرد عند عدم التغيير. تعيد strip قيمة جديدة مشذبة، وتعدل strip! المستقبل وتعيد nil إذا لم يلزم تشذيب. لذلك قد تفشل سلسلة strip!.upcase على مدخل نظيف. يفصل المثال المشتق عن النص الأصلي القابل للتعديل ويعرض رد عدم التغيير. تتجنب String.new الاعتماد على إعداد تجميد القيم النصية. لم تتوفر Ruby، فالمخرجات توقعات تحليلية لا نتائج مفسر متحققة.

ruby قيمة مشتقة ونتيجة bang عند عدم التغيير
title = String.new(' archive ')
normalized = title.strip.upcase
puts normalized
puts title.start_with?(' ')
unchanged = String.new('ready')
puts unchanged.strip!.nil?
الناتج المتوقع
ARCHIVE
true
true

المخرج المتوقع ARCHIVE ثم true ثم true. يحتفظ الأصل بمسافته الأولى، وتعيد strip! على النص النظيف nil. لم يُنفذ البرنامج.

طابق القيمة كلها عند التحقق من رمز

لا يثبت عثور regexp على جزء أن المدخل كله يتبع الصيغة. يثبت \A و\z بداية النص كله ونهايته في Ruby، وقد تختلف مراسي الأسطر مع نهايات السطر. تسأل match? سؤال مطابقة منطقيا دون الاعتماد على نتيجة مطابقة عامة ضمنية. أبق الملتقطات محلية عند الاستخراج. اهرب الأجزاء الحرفية المعطاة من المستخدم بالواجهة المناسبة ولا تدخلها كبنية نمط نشطة. تجنب نمطا معقدا غير محدود إذا عبّرت صيغة أبسط محدودة عن المطلب.

ليست صيغة التحويل قاعدة المجال نفسها

تتسامح to_i وقد تحول بادئة عددية وتتجاهل نصا لاحقا. ترفض Integer من Kernel بقاعدة صريحة و exception:false مدخلا لا يحقق صيغة تحويلها. لا يلزم أن تطابق تلك الصيغة تنسيق المنتج الدقيق، وقد يخالف السالب المحلل قاعدة الإيجابية. افصل التحقق النصي والتحويل وفحص النطاق. يقارن المثال النص اللاحق والصحيح الموجب والسالب، ويستخدم nil اختصارا لفشل التحليل عند هذا الحد التعليمي فقط.

ruby تحويل متسامح وصارم ومطابقة كاملة
puts '12x'.to_i
['42', '42x', '-1'].each do |text|
  value = Integer(text, 10, exception: false)
  puts(value.nil? ? 'invalid' : value)
end
puts(/\A[A-Z]-[0-9]{2}\z/.match?('A-07'))
الناتج المتوقع
12
42
invalid
-1
true

الأسطر المتوقعة 12 ثم 42 ثم invalid ثم -1 ثم true. تتحقق المطابقة الأخيرة من شكل اصطناعي فقط، لا وجود أو تفويض. لم يُنفذ مفسر.

طبّع وفق سياسة معلنة فقط

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

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

يسبب نص نظيف NoMethodError بعد strip!.

لماذا يحدث؟
أعادت طريقة bang قيمة nil لعدم حدوث تغيير.
كيف تصلحه؟
استخدم تحويلا لا يعدل أو عالج رد عدم التغيير الموثق.
كيف تتجنب تكراره؟
افحص المدخل المطبّع سابقا إلى جانب غير النظيف.

يُقبل نص لاحق زائد كعدد.

لماذا يحدث؟
استُخدمت to_i المتسامحة كمتحقق.
كيف تصلحه؟
استخدم الصيغة الكاملة المقصودة وحد تحويل صارما.
كيف تتجنب تكراره؟
أدرج بادئة عددية صحيحة يتبعها نص غير صالح.

تقبل مطابقة جزئية معرفا أكبر غير صالح.

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

اختبر فهمك

1. لماذا قد تخفي to_i الفرق بين الصفر والنص المشوه؟

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

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

2. هل يجب أن يشذب استيراد الأرشيف كل معرف ويحوله لحروف كبيرة دائما؟

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

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

أهم ما تعلمته

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

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