سؤال

آمل أن تعني البنية التحتية لرسائل روبي أن هناك بعض الخدعة الذكية لهذا الغرض.

كيف يمكنني تحديد كائن الاتصال - أي كائن يسمى الطريقة التي أنا فيها حاليًا؟

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

المحلول

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

كائنات الفصل Binding قم بتغليف سياق التنفيذ في مكان معين في الكود واحتفظ بهذا السياق للاستخدام في المستقبل.

http://www.ruby-doc.org/core-2.1.4/binding.html

هل يجب أن أذكر ، يجب استخدام هذه التقنية فقط لأغراض تصحيح الأخطاء أو المرح أو التعليمية, ، لأنه ينتهك مبادئ 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top