2016-04-22 5 views
2

を私の匿名のモジュールを検出するために、私は匿名のモジュールとprepend外国クラス(その場で作成されています。)どのくらいの実行中に、いくつかのクラスの祖先で

、私は私の匿名のモジュールprependedをそれにリストする必要があります。残念ながら、Module#newは、Class#newとは異なり、(言い換えれば、彼らはすべての私は、すべてのancestorsのうち、私のモジュールふるいに使うことができると同じ共通のダミーの親を持つことはできません。)parentパラメータを受け付けません

I可能性私の匿名の各モジュールに具体的にmy_litmus_dummy_methodを定義し、それを確認しながらancestors.select、これは醜いです。

私の匿名モジュールのそれぞれでinclude DummyLitmusModuleがあり、それが祖先であることを確認している間にancestors.selectですが、これはどちらかというと醜いものです。

マーク私の匿名モジュールは、後で私は簡単にすべてのモジュールリストからそれらをふることができるようにエレガントな方法ですか?私が必要とするこの時点^ Wで


UPDコード例

def patch_class klazz 
    klazz.send :prepend, Module.new { define_method(:my_method) {} } 
end 

... 

# load list of classes from somewhere and patch them 
classes = my_parse_yaml('config.yml') 
classes.each do |c| 
    patch_class c 
end 

... 

# somewhere in other place 
instance.patches # ⇐ I want to implement this 

をパッチし、どのような方法を知りたいです。私はちょっとRailsからalias_method_chainを再実装しました。私は "使用"を私のインターフェースユーザーに報告したいと思います。

+0

。 (i)あなたはプリペンドされたモンドと含まれているものとを区別したい、そして(ii)あなたは名前のついたものではなく、匿名のものだけを気にしますか? – sawa

+0

わかりませんが、[this](http://stackoverflow.com/questions/34484006)と関連があるかもしれません。 – sawa

+1

あなたの匿名モジュールに名前をつけてみませんか? – Aetherus

答えて

0

ストアあなたの匿名のモジュールがどこかで、その後、あなたはそれらを見つけることができるようになります:

patches = [Module.new] # some other module 
c = Class.new 
m = Module.new 
c.prepend m 
patches << m 

instance = c.new 
used_patches = patches.select{|p| instance.is_a? p} 
+1

うん、グローバル変数は、それを愛する。 – mudasobwa

+0

@ mudasobwaという名前のクラス/モジュールは実際にはグローバル変数であるため、これはあまりにも悪くないかもしれません。 – Vasfed

1

Module#prependをパッチについては?

class Module 
    attr_reader :mods_prepended 
    alias :old_prepend :prepend 
    def prepend(*mods) 
    @mods_prepended =|| {} 
    (@mods_prepended[self] =|| []).concat(mods) 
    end 
    old_prepend(*mods) 
end 

class C 
    def patches 
    Module.mods_prepended[self.class] 
    end 
end 

次に、目的の情報は次式で与えられます(特に `my_litmus ...`メソッドまたは `DummyLitmusModule`について)私には非常に明確ではありません

C.new.patches 
+0

私はそれについて考えてきました。これはどうしてもうまく見えますが、私は 'Module#prepend'にパッチを当てるのを恐れています:)これは90年代初めの不合理な恐怖です。当時は、C/C++ライブラリの中で '#define A B'が普及し、すぐに目的の結果を得ることができました。私は自分自身を信じていますが、生産時には、鯨やタートルを損なわないようにしています。 – mudasobwa

+0

もう一つの不具合は、 'instance#patches'が時間を費やしていて問題ないですが、ジェネリックメソッドにペナルティを追加することを拒否しています。とにかく、それはここで最高の答えとしてupvoted。私はまだすべてが欠けているいくつかの魔法が存在することを願っているので、正しいとは記されていません。 – mudasobwa

+0

モジュールをサブクラス化することは有望であり、この「エイリアス」の駄目さえもなくなるでしょう。多分それ。私は私のテストでそれを試してみると、感謝、キャリーを報告します! – mudasobwa

関連する問題