كيف يمكنك التأثير على التسلسل الذي يتم تحميل رمز الياقوت؟
-
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 إلى جانب التمسك به في نفس الملف المصدر الذي عدله؟
هناك سببان لسؤالي:
- قد لا أريده أن يعرف أنني فعلت هذا
- إذا تم تغيير الملف المصدر بحيث ينتهي الاسم المستعار أسفل 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
من أجل حفظ السلوك الحالي.