2016-11-14 8 views
4

モジュールがどこから拡張されているかを調べようとしています。今私が思いついた唯一のことは、callerを使用して、適切な行を選ぶことです。それを扱うための慣習的で脆弱な方法はありますか?Ruby:モジュールが拡張された場所

module ClassMethods 
    def self.extended(base) 
    p caller[2] 
    end 
end 
私は個人的にこのような何かのために行くだろう
+0

ファイルの名前を探したいだけですか?特定の行番号も検索したいですか? – Rashmirathi

+0

私はファイルへのパスを探しています。行番号は関係ありません。 – lobati

+2

診断目的と同じように興味がありますか?実際のコードでこの種のものを使用することは問題になる可能性があります。 – tadman

答えて

2

(OPさんのコメントに基づいて):

module ClassMethods 
end 

class Object 
    def extend_with_path(mod, filename) 
    p filename 
    self.extend(mod) 
    end 
end 


class Foo 
    extend_with_path ClassMethods, __FILE__ 
end 

あなたがbaseクラスの内部知識を持っていると仮定すると、あなたがこのような何かを試みることができる:

module ClassMethods 
    def self.extended(base) 
    p base.new.method(:superfluous_method).source_location 
    end 
end 

class Foo 
    def superfluous_method 
    end 

    extend ClassMethods 
end 

PS:これは巨大なハックであり、非常にいいとは思いますが、私はそこにこのようなことをするより良い方法です。

+1

ニースですが、その時点では、モジュールの代わりに文字通りパスを定義することもできます: 'class Foo; FILE_PATH = __FILE__; ClassMethodsを拡張する。終わり。 – lobati

+1

ありがとうございます。私のアプローチがあまりにも苦痛に終わるなら、私はおそらくそれのようなもののためにそれを取り替えることに終わるでしょう。 https://github.com/mockdeep/configurator/commit/03f208 – lobati

+0

申し訳ありませんが、以前の返信を削除しました。「ええ、非常に良い点です。その場合、正直、ファイル名を渡すのではなく、定数。" – Rashmirathi

関連する問題