Ruby でメソッドの呼び出し元の情報を取得する

例えば、次のコードのように『A.hoge の呼び出し元の情報』を取得したいことがあります。

module A
    def self.hoge
        # 呼び出し元である X オブジェクトを取得したい
    end
end

class X
    A.hoge
end

標準の範囲だとできなさそうだったんですが、binding_of_caller という gem を使えば実現出来るみたいです。

使い方

$ gem install binding_of_caller

使い方

require "binding_of_caller"

module A
    def self.hoge
        # 呼び出し元のコンテキストで式を評価出来る
        p binding.of_caller(1).eval("self")
        # => X
        p binding.of_caller(1).eval("hoge")
        # => "hoge"
    end
end

class X
    def self.hoge
        "hoge"
    end

    A.hoge
end

binding_of_caller を使用することで『呼び出し元のコンテキストで式を評価する事が出来る』ので実現することが出来ます。
闇が深い…。

参照