モジュールがどこから拡張されているかを調べようとしています。今私が思いついた唯一のことは、caller
を使用して、適切な行を選ぶことです。それを扱うための慣習的で脆弱な方法はありますか?Ruby:モジュールが拡張された場所
module ClassMethods
def self.extended(base)
p caller[2]
end
end
私は個人的にこのような何かのために行くだろう
モジュールがどこから拡張されているかを調べようとしています。今私が思いついた唯一のことは、caller
を使用して、適切な行を選ぶことです。それを扱うための慣習的で脆弱な方法はありますか?Ruby:モジュールが拡張された場所
module ClassMethods
def self.extended(base)
p caller[2]
end
end
私は個人的にこのような何かのために行くだろう
(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:これは巨大なハックであり、非常にいいとは思いますが、私はそこにこのようなことをするより良い方法です。
ニースですが、その時点では、モジュールの代わりに文字通りパスを定義することもできます: 'class Foo; FILE_PATH = __FILE__; ClassMethodsを拡張する。終わり。 – lobati
ありがとうございます。私のアプローチがあまりにも苦痛に終わるなら、私はおそらくそれのようなもののためにそれを取り替えることに終わるでしょう。 https://github.com/mockdeep/configurator/commit/03f208 – lobati
申し訳ありませんが、以前の返信を削除しました。「ええ、非常に良い点です。その場合、正直、ファイル名を渡すのではなく、定数。" – Rashmirathi
ファイルの名前を探したいだけですか?特定の行番号も検索したいですか? – Rashmirathi
私はファイルへのパスを探しています。行番号は関係ありません。 – lobati
診断目的と同じように興味がありますか?実際のコードでこの種のものを使用することは問題になる可能性があります。 – tadman