2016-11-11 43 views
0

標題可能不明確。如何在方法bb中使用方法aa的方法獲取方法bb的調用方

這裏是代碼

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的信息時,BB是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'是非常殘酷的黑客攻擊。它到達執行引擎的私有內部實現細節內部,並刪除它沒有訪問權限的信息。這意味着它與執行引擎甚至其特定版本非常緊密相關。例如,它不適用於歐泊,它不適用於MRuby,它不適用於IronRuby。在JRuby上,它只在使用解釋器時才起作用(幾乎沒有人會這樣做,因爲積極優化編譯器所獲得的性能是首先使用JRuby的主要原因之一)。 ... –

+0

...在YARV上,任何時刻都可以通過內部的任何改變而被破壞,例如不適用於YARV 2.2和2.3,只有2.1和更低版本。哦,我忘了:它也不適用於MagLev。在MacRuby上。在RubyMotion上。 –