سؤال

method_missing.

* obj.methet_missing (رمز H، Args I) → Other_obj

استدعاء RUBY عندما يتم إرسال OBJ رسالة لا يمكن التعامل معها. الرمز هو الرمز للطريقة التي تسمى، والأرجس هي أي حجج تم تمريرها إليها. ينشئ المثال أدناه فئة رومانية، والتي تستجيب للطرق بأسماء تتكون من الأرقام الرومانية، وإرجاع القيم الصحيحة المقابلة. الاستخدام الأكثر نموذجية للمنتواضع هو تطبيق الوكلاء والوفدين والدراسات التقالير.

class Roman
  def roman_to_int(str)
    # ...
  end
  def method_missing(method_id)
    str = method_id.id2name
    roman_to_int(str)
  end
end
r = Roman.new
r.iv ! 4
r.xxiii ! 23
r.mm ! 2000

سمعت فقط عن الطريقة المفقودة وذهب لمعرفة المزيد في برمجة روبي لكن التفسير أعلاه المقتبس من الكتاب هو فوق رأسي. هل لدى أي شخص شرح أسهل؟ وبشكل أكثر تحديدا، هو طريقة مفقودة تستخدم فقط من قبل المترجم أو هل هناك حاجة إلى الاتصال به مباشرة في برنامج (على افتراض أنني مجرد كتابة تطبيقات الويب، على عكس كتابة رمز ل NASA)؟

هل كانت مفيدة؟

المحلول

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

ما هي Methorm_Missing، تتيح لك اعتراض المكالمات والتعامل معها إلى طرق غير موجودة لكائن معين. يوفر هذا الطاقة تحت غطاء محرك السيارة وراء كل DSL (لغة خاصة بالمجال) مكتوبة في Ruby.

في حالة المثال، كل واحد من 'R.IV'، 'R.MM'، وهلم جرا هو في الواقع دعوة طريقة إلى الكائن الروماني. بالطبع، لا يحتوي على طريقة "IV" أو "MM"، لذلك يتم تمرير التحكم بدلا من ذلك إلى Method_Missing، والتي تحصل على اسم الطريقة التي تم استدعاؤها، وكذلك ما تم تمرير الحجج.

يقوم Method_Missing ثم بتحويل اسم الطريقة من رمز إلى سلسلة، ويقعه كرقم روماني، وإرجاع الإخراج كعدد صحيح.

نصائح أخرى

من المحتمل أن لا تفكر في Ruby على أنها أساليب. عند استدعاء "طريقة" Ruby "، تقوم بالفعل بإرسال رسالة إلى هذه الحالة (أو فئة) وإذا كنت قد حددت معالجا للرسالة، فسيتم استخدامه لمعالجة قيمة وإرجاع قيمة.

وبالتالي method_missing هو تعريف خاص يحصل يسمى متى لا يمكن ل Ruby العثور على معالج ملائم. يمكنك أيضا التفكير في الأمر مثل * طريقة.

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

SomeModel.find_by_name_and_number(a_name, a_number)

لا يحتوي النموذج على رمز لتلك Find_by، لذلك يتم استدعاء Methold_Missing الذي يبدو عنده - أدرك هذا التنسيق، ويحمله. إذا لم يحدث ذلك، فستحصل على طريقة لم يتم العثور عليها.

في المثال الروماني، توضح ذلك يوضح كيف يمكنك تمديد وظائف الفصل دون تحديد الأساليب بشكل صريح.

R.IV ليست طريقة لذلك method_missing يمسكها والمكالمات roman_to_int على معرف طريقة "IV"

من المفيد أيضا عندما تريد التعامل مع الأساليب غير المعترف بها في مكان آخر، مثل الوكلاء والوفدين والدراسات التقالير، كدول توثيق.

أنت لا تتصل "method_missing"(مترجم يدعوها). بدلا من ذلك، أنت حدد (تجاوزه) لفصل تريد أن تكون أكثر مرونة. كما ذكر في تعليقات أخرى، سيقوم المترجم بالاتصال بإصدارك method_missing عند الفصل (أو مثيل) لا ("صراحة"؟) تحديد الطريقة المطلوبة. يمنحك هذا فرصة لجعل شيء ما، بناء على طريقة ISSATZ / اسم الرسالة.

هل سبق لك أن قمت بأي برمجة "انعكاس" في جافا؟ سيكون استخدام هذه الطريقة كما لو أن الفصل المراد الوصول إليه عبر الانعكاس قد ينظر إلى السلسلة (إسمح لي، "رمز") من اسم الطريقة إذا تم إلقاء استثناء غير من هذا القبيل، ثم قم بعمل شيء ما التنفيذ على الطيران.

البرمجة الديناميكية هي نوع من "One-up" على الانعكاس.

نظرا لأنك تذكر تطبيقات الويب، سأعتقد أنك على دراية براغي على القضبان. مثال جيد على كيفية method_missing يمكن أن تستخدم هو مختلف find_by_<whatever> الأساليب المتاحة. لا توجد من هذه الأساليب موجودة بالفعل! يتم تصنيعها خلال وقت التشغيل. كل هذا السحر يحدث بسبب كيفية اعتراض روبي الدعوات للأساليب غير الموجودة.

يمكنك قراءة المزيد حول هذا واستخدامات أخرى للطريقة هنا.

activerecord الاستخدامات method_missing لتحديد طرق find_by. لكن منذ، method_missing هي في الأساس طريقة المنتجة الأخيرة، وهذا يمكن أن يكون عنق الزجاجة أداء خطيرة. ما اكتشفته هو أن activerecord يقوم ببعض metaprogramming رهيبة من خلال تحديد طريقة الباحث الجديدة كطريقة فئة !! وبالتالي، فإن أي مكالمات أخرى إلى نفس طريقة الباحث لن تضرب method_missing لأنه الآن طريقة الفصل. للحصول على تفاصيل حول مقتطف التعليمات العامة الفعلية من Base.rb، انقر هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top