[#954] Rational — keiju@... (Keiju ISHITSUKA)

けいじゅ@SHLジャパンです.

23 messages 1996/10/30
[#955] Re: Rational — matz@... (Yukihiro Matsumoto) 1996/10/30

まつもと ゆきひろです.

[#968] Re: Rational 1996/10/31

けいじゅ@SHLジャパンです.

[ruby-list:692] Re: ? for Object#extend

From:
Date: 1996-10-01 03:46:05 UTC
List: ruby-list #692
けいじゅ@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 <----

In This Thread

Prev Next