From: nagachika Date: 2011-06-04T03:45:32+09:00 Subject: [ruby-dev:43623] Re: Module#mix 近永と申します。 まず 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) もちろん必要な定数をコピーすれば動きますが、fileutils.rb の中で OPT_TABLE は OPT_TABLE = {} #:nodoc: internal use only のように nodoc と指定されていて、内部的な定数であるようです。 ライブラリのユーザがこのような定数の存在を意識しないといけないのは 内部構造に依存することになってよくないと思います。 指定なしで定数がコピーされるならば意識せずに利用できますが、衝突が発生した時に rename することで回避した場合、これもメソッドの時と同様にコピーされるメソッド内で その定数を参照している部分も rename すべきかどうかというのも論点になるかと思います。