けいじゅ@SHLジャパンです. In [ruby-list :00663 ] the message: "[ruby-list:663] Re: ? for Object#extend ", on Sep/30 15:44(JST) matz / caelum.co.jp (Yukihiro Matsumoto) writes: >|で, リクエストもありまして, ビルトインクラスにextendするわけにはいかな >|いのか? というものです. >ビルトインクラスをextendできないのは以下の理由です. > > * ビルトインクラスのように良く使われるものがインスタンス毎 > に動作が違うのはどうだろうか > * ビルトインクラスはインスタンス変数を持てないので,メソッ > ドを追加する時に不自由が出る > >しかし,どうしてもそうでなければならないほど強い理由ではない >です.現実にチェックしている部分を外せば簡単にできるようにな >るはずです.後者はビルトインクラスのサブクラスが作れる以上意 >味が無いという話もありますね. そうですね. 確かに, 意味がないように感じます(^^;; >|あと, 特異メソッドもビルトインクラスのインスタンスには登録できませんよ >|ね. 登録できるようには難しいのでしょうか?? > >これもチェックしている部分は同じですから,上述の通り難しくは >無いです. なるほど. どちらがいいんですかねえ... とりあえず, 私が extend したくなった状況を説明しましょう. ビルトインクラスにextendしたいと思ったのは, ソート用のモジュール Sortableというのを作っていたからです. SmalltalkのSortedCollectionと同じような機能を持つモジュールで, ソート の機能と2分検索をサポートするなのですが, rubyらしくモジュールの方が良 いかと思ったわけです. なぜ, クラスではなくてモジュールなのかというと, ソートの可能性は[], []=と要素間の比較ができればよいわけで, クラスである必要はないかと思っ たわけです. また, ソートの仕方はクラス毎に決まるものではなく, オブジェクト単位に決 まることが多いと思うので, arrayなどのオブジェクトにextendできれば良い なあと感じたわけです. 使い方としては, 以下のような感じです. a = [1, 2 , 3] a.extend Sortable a.sort{|e1, e2| e2 <=> e1} # -> a == [3, 2, 1] a.insert(0) # -> a == [3, 2, 1, 0] a.delete(2) # -> a == [3, 1, 0] a.sort{|e1, e2| e1 <=> e2} # -> a == [0, 1, 3] まず, Sortableをextendしてから, sortをかけます. このsort関数は, モジュー ル関数でsortと同時に比較関数を設定します. で, そのあと, 色々な操作がで きるようになるというわけです. まあ, 今のような背景があるわけですが, どうなんですかね? このような形態 のモジュールはあまり好ましくないということになるのでしょうか? このモジュール以外の方法としては, Hashクラスのようにキーとオブジェクト を分けるやり方もありますが, そういうクラスもこのSortableがあれば簡単に 実現できるようになります. __ .....................................石塚 圭樹@事開事.三井造船(株)... ------------->アドレス変わりました!! e-mail: keiju / csg.mes.co.jp <----