2016-11-11 16 views
0

タイトルが正しくない可能性があります。ここメソッドaaのブロックで宣言されたメソッドbbのメソッドbbの呼び出し元を取得する方法

はBBが

どのようにこの問題を解決するか、それを解決することができるAAブロックで実行されたときにコード

def self.aa(&block) 
    instance_eval &block 
    end 

    def self.bb 
    # i want to get aa info here 
    p caller[0] 
    end 

#shuriken is a module 
Shuriken.aa do 
    bb 
end 

私はAAの情報を取得したいのですか?ありがとう。

+1

_ "私はの情報を取得したいですaa "_ - あなたはもっと具体的になることができますか?あなたは' bb'で正確に何をしたいですか?あなたは達成しようとしていることを(言い換えれば、コードではなく)記述できますか?これは、あまり抽象的な例(つまり、実際のメソッド名では 'aa'や' bb'ではなく)を使うのに役立ちます。 – Stefan

答えて

0

私の答えにプレフィックスを付けるには:これは非常に悪い習慣です。プロダクションコードでこれをしないでください。 binding_of_caller宝石を使用して

、我々は現在の方法に二つのフレームまでを評価する(最初のフレームまではBasicObject#instance_eval、第二枠アップがShuriken.aaである):

require 'binding_of_caller' 

class Shuriken 
    def self.aa(&block) 
    instance_eval &block 
    end 

    def self.bb 
    the_aa = binding.of_caller(2).eval('method(__method__)') 
    puts the_aa 
    # => #<Method: Shuriken.aa> 
    end 
end 

Shuriken.aa do 
    bb 
end 
+0

なぜそれが極端に悪いのですか? – junk

+2

'binding_of_caller'は本当に残酷なハックです。それは、実行エンジンの内部的な内部実装の詳細に到達し、アクセスするビジネスを持たない情報を取り除きます。つまり、実行エンジンやその特定のバージョンにも密接に関連しています。たとえば、Opalでは動作しません.Murubyでは動作せず、IronRubyでは動作しません。 JRubyでは、インタプリタを使用するときにのみ動作します(ほとんど誰もしません。積極的に最適化するコンパイラによって得られたパフォーマンスは、JRubyを最初に使用する主な理由の1つです)。 ... –

+0

... YARVでは、内部の変更によって瞬時に破損する可能性があります。 YARV 2.2と2.3では動作しません。2.1とそれ以下で動作します。ああ、私は忘れていた:それはまた、MagLevで動作しません。そしてMacRubyについて。そして、RubyMotionについて。 –

関連する問題