From: matz@... (Yukihiro Matsumoto) Date: 2002-02-19T22:58:30+09:00 Subject: [ruby-dev:15969] Re: [BUG?] include after module definition and extend module まつもと ゆきひろです In message "[ruby-dev:15964] Re: [BUG?] include after module definition and extend module" on 02/02/19, Tanaka Akira writes: |ただ、topological sort 済みのリストを merge して topological sort 済み |のリストを生成するのは難しいのではないかと思います。かなり深く考察し、 |うまい制約を見つけない限り不可能でないかという気がします。 | |従って、基本に従って direct super class/module のリストを保存して、変 |更時に traverse しなおして ancestors を作りなおすのが妥当なところでは |ないか、と思います。 厳密にはそうでしょうね。まあ、全体を作り直すのはちょっと手間 なので(その労力はRiteに回したい)、1.7/1.8では適当にお茶を濁 そうと思ってます。 |なお、気がついたのですが、今は | |% ruby -e ' |module A; end |module B; end |module C; include B; end |module B; include A; end |module A; include C; end |p A.ancestors, B.ancestors, C.ancestors |' |[A, C, B] |[B, A] |[C, B] | |というように cycle を発見できないこともあるようです。 検出しようとしているサイクルは [A, C, A] のようなものですか ら、現時点でのトポロジカルな構造はサイクルになっていても、時 間順の結果としての個々のモジュールの ancestors がサイクルで ないんで検出しなくても良いかなあと思うんですが。 |あと、作りなおす方の話ですが、ObjectSpace.each_object(Module) だと特異 |クラスが出てこないので、extend された Object は扱えないのですが、効率 |的に特異クラスをリストアップする方法ってあるんでしょうか? ないです。 えーと、元のニーズってのは特異クラスも含めた話だったんですっ け。あ、「extendしている場合」って表現もありますね。まあ、そ んなに緊急性の高い話ではないんで、特異でないクラスで経験を積 んでから、ということで。 まつもと ゆきひろ /:|)