أي طريقة لتحديد أي كائن يسمى الطريقة؟
-
01-10-2019 - |
سؤال
آمل أن تعني البنية التحتية لرسائل روبي أن هناك بعض الخدعة الذكية لهذا الغرض.
كيف يمكنني تحديد كائن الاتصال - أي كائن يسمى الطريقة التي أنا فيها حاليًا؟
المحلول
كخيار ، هناك ملف binding_of_caller
جوهرة يتيح لك ذلك تنفيذ التعليمات البرمجية في سياق أي متصل على مكدس الاتصال (المتصل ، المتصل بالمتصل وما إلى ذلك). إنه مفيد للتفتيش (اقرأ افعل أي شيء في أي وضع على مكدس المكالمات) مكدس الاتصال في التطوير ، كما هو مستخدم في better_errors
.
كائنات الفصل
Binding
قم بتغليف سياق التنفيذ في مكان معين في الكود واحتفظ بهذا السياق للاستخدام في المستقبل.
هل يجب أن أذكر ، يجب استخدام هذه التقنية فقط لأغراض تصحيح الأخطاء أو المرح أو التعليمية, ، لأنه ينتهك مبادئ OOP بشدة.
في الغالب بسبب eval
.
لنعد الأشياء:
require 'binding_of_caller' # I assume, you installed this gem already?
احصل على ال فوري (الأقرب على المكدس ، وبالتالي 0
) مثيل المتصل:
binding.of_caller(0).eval('self')
... أو حتى طريقة استدعاء فورية:
binding.of_caller(0).eval('__method__')
إذا كنت بحاجة إلى الحصول على أعلى مكدس المكالمات ، فاستخدم أرقام غير ذلك 0
للحصول على ملزمة المتصل.
اختراق بفظاعة. ولكن إذا كنت بحاجة حقًا إلى هذا - فهناك تذهب.
نصائح أخرى
يمكنك بسهولة إلقاء نظرة على سطر الكود الذي يسمى وظيفة الاهتمام من خلال
caller.first
الذي سيخبرك اسم الملف ورقم السطر الذي يسمى الوظيفة ذات الصلة. يمكنك بعد ذلك عودة إلى الكائن الذي كان عليه.
ومع ذلك ، يبدو أنك أكثر بعد بعض الكائنات التي تسمى وظيفة معينة ، ربما في طريقة مثيل. لست على دراية بأسلوب لمعرفة ذلك - لكنني لن أستخدمه على أي حال ، لأنه يبدو أنه ينتهك التغليف بشكل سيء.
التكنولوجيا في أفضل حالاتها:
1 # phone.rb
2 class Phone
3 def caller_id
4 caller
5 end
6 end
7
8 class RecklessDriver
9 def initialize
10 @phone = Phone.new
11 end
12 def dial
13 @phone.caller_id
14 end
15 end
16
17 p = Phone.new
18 p.caller_id.inspect # => ["phone.rb:18:in `<main>'"]
19
20 macek = RecklessDriver.new
22 macek.dial.inspect # => ["phone.rb:13:in `dial'", "phone.rb:22:in `<main>'"]
ملحوظة: رقم خط للأغراض التوضيحية. phone.rb:X
يشير إلى الخط X
من السيناريو.
ينظر الى phone.rb:13
! هذه dial
الطريقة هي ما أرسل المكالمة! و phone.rb:22
يشير إلى السائق المتهور الذي استخدم dial
طريقة!
تقصد مثل self
?
irb> class Object
.. def test
.. self
.. end
.. end
=> nil
irb> o = Object.new
=> #<Object:0xb76c5b6c>
irb> o.test
=> #<Object:0xb76c5b6c>
بيتر إجابه يستخدم في مثال رمز الإنتاج
في شركتي كنا ننهم deleted
علم في نكهة جنون العظمة جوهرة deleted_at
عمودي. الرمز المربع هو كيف كنا نضمن أن كل شيء سوف يسير على ما يرام قبل إزالة العمود (نشر هذا الرمز وبعد ذلك بعد يومين أو 3 أيام من أن ننشر الترحيل remoove_column :lessons, :deleted
class Lesson < ActiveRecord::Base
def deleted
if caller.select { |c| c.match /serialization\.rb/ }.any?
# this is Rails object mapping
!!deleted_at
else
raise 'deplicated - deleted was replaced by deleted_at'
end
end
end