なかだです。

At Sat, 4 Jun 2011 03:45:32 +0900,
nagachika wrote in [ruby-dev:43623]:
> まず r31873 で導入された Module#mix は定数のコピーの指定が効いていないのと、
> 定数の指定が rename ありの指定しか受け付けていませんでした。
> 修正したパッチを以下に上げておきます。
> 
> https://github.com/nagachika/ruby/commit/fb7314e3682da41fa32a0ef0a4d8822f1b3d2ef0

たしかに定数まわりは未実装部分が残っていました。

> こちらが本題ですが Module#mix の仕様について、問題だと感じる点がありましたので
> 論点に加えて頂きたいと思います。
> 
> mix はデフォルトでは定数をコピーしませんが、そのため内部クラスや定数に依存した
> メソッドが利用できなくなってしまいます。たとえば以下のような FileUtils の例があります。
> 
> require "fileutils"
> class C
>   mix FileUtils
>   def meth1
>     touch("file")
>   end
> end
> 
> C.new.meth1  #=> uninitialized constant C::OPT_TABLE (NameError)
> 

RubyKaigi2010でのスライドp56([1]24:34)では、mixされたメソッドは
元のスコープから定数を探索するという風に見えます。つまり、メソッ
ドエントリーを単純にコピーしている今の実装が、仕様と違うというこ
とではないかと思います。

[1] http://www.nicovideo.jp/watch/sm11914317

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦