From: SASADA Koichi Date: 2012-11-12T19:20:09+09:00 Subject: [ruby-dev:46497] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): (2012/11/12 18:20), Shugo Maeda wrote: > あと、別のメールでprependよりrefinementを優先してほしいとまつもとさんが > おっしゃっているので、その方法を考えないといけないですね。 > 一貫性を考えるとprependの方が優先されてもいい気がしますが、使い勝手は > refinement優先の方がよいように思います。 > > ちょっと考えたのですが、すでにモジュールがprependされているクラスをrefine > した場合は、prependされているモジュールにrefinedメソッドを追加してしまうの > がよいように思います。 > そうすると、同じモジュールをprependしている他のクラスのメソッド探索にも > 影響がありますが、速度低下だけで動作自体は同じになると考えています。 > > 問題は、refineされた後でprependされた場合ですが、こちらはちょっと対応が > 面倒そうですねえ。 > prependした時に、常にprepend対象のクラスのメソッドテーブルを調べて、 > モジュールにrefinedメソッドを追加するくらいですかねえ。  prepend の細かい挙動を知らないのですが, class C prepend M1 prepend M2 end module M refine C ... end end class C prepend M3 end のとき,たしか C のメソッドテーブルを null にしておいて云々,と聞いたと 思うんですが,ここでもう,refinement check only なメソッドエントリを置く ようにするとどうですかね. # いや,なんかそもそも refinement と prepend を混ぜるってのは, # 色々と基本設計間違ってるというか,後付け感がひどい感じがする. # 出来るけどやっちゃいけない感じ. -- // SASADA Koichi at atdot dot net