From: Shugo Maeda Date: 2012-11-16T17:22:47+09:00 Subject: [ruby-dev:46527] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): 前田です。 2012年11月16日 17:02 Nobuyoshi Nakada : >> それでもいいかもしれませんが、他のモジュールをprependした時に挿入位置を調整したり >> するのが面倒じゃないです? >> また、usingを使っていないコンテキストで呼ばれた時に、メソッド探索のコストが増えるように >> 思います。 > > そういったデメリットもたしかに考えられるのですが、例えば以下のよ > うにusingのあとでさらにrefineされた場合はそのメソッドエントリは > 書き換えられないのではないかという気がします。 > > class X > end > module M > refine(X) {} > end > using M > module M > refine(X) {def foo;:foo;end} > end > p X.new.foo > > refine中では対象のクラスはわかっているわけだから、メソッド定義の > ときにすでに書き換えられたメソッドエントリを書き直してまわればい > いのかな。 refineのブロック内でメソッド定義するたびにメソッドエントリを追加又は変更するものと思って いましたが、prependベースの案だとそうしなくてよいんです? # prependベースだと追加だけでよくなると思いますが。 どちらかというと、rb_method_definition_t::bodyに元のメソッドエントリを保存する方法だと メモリ管理の面で面倒(メソッドエントリはメモリ管理が特殊なので)な気がしてきたので、 そういう意味でprependベースの方がすっきりするかもしれないですね。 -- Shugo Maeda