كيف يمكنك التأثير على التسلسل الذي يتم تحميل رمز الياقوت؟

StackOverflow https://stackoverflow.com/questions/872663

  •  22-08-2019
  •  | 
  •  

سؤال

دعنا نقول أن زميلك في العمل monkeypatches فئة FixNum وإعادة تعريف طريقة + للطرح بدلاً من إضافة:

class Fixnum
  def +(x)
    self - x
  end
end

>> 5 + 3
=> 2

مشكلتك هي أنك تريد الوصول إلى الوظيفة الأصلية لطريقة +. لذلك يمكنك إسقاط هذا الرمز قبله في نفس الملف المصدر. إنه مستعار للطريقة + إلى "Original_Plus" قبل انه monkeypatch.

class Fixnum
  alias_method :original_plus, :+
end

class Fixnum
  def +(x)
    self - x
  end
end

يمكنك الآن الوصول إلى الوظيفة الأصلية للطريقة + من خلال Original_Plus

>> 5 + 3
=> 2
>> 5.original_plus(3)
=> 8

لكن ما أحتاج إلى معرفته هو:

هل هناك أي طريقة أخرى لتحميل هذا الاسم المستعار قبل تحميل monkeypatch إلى جانب التمسك به في نفس الملف المصدر الذي عدله؟

هناك سببان لسؤالي:

  1. قد لا أريده أن يعرف أنني فعلت هذا
  2. إذا تم تغيير الملف المصدر بحيث ينتهي الاسم المستعار أسفل monkeypatch ، فلن ينتج الاسم المستعار النتيجة المرجوة.
هل كانت مفيدة؟

المحلول

بالتأكيد. ما عليك سوى التمسك بمضادات monkeypatch في الكود الخاص بك قبل تحتاج إلى ملف المصدر الخاص به.

 % cat monkeypatch.rb
 class Fixnum
   def +(x)
     self - x
   end
 end
 % cat mycode.rb
 class Fixnum
   alias_method :original_plus, :+
 end
 require 'monkeypatch'
 puts 5 + 3 #=> 2
 puts 5.original_plus(3) #=> 8

نصائح أخرى

Monkeypatching جميل لتوسيع فصل دراسي موجود وإضافة ميزات جديدة. Monkeypatching لتغيير سلوك الميزات الحالية هو مجرد مجنون!

على محمل الجد ، يجب أن تتحدث مع زميلك في العمل.

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

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