[#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:710] Re: ? for Object#extend

From: matz@... (Yukihiro Matsumoto)
Date: 1996-10-02 02:50:46 UTC
List: ruby-list #710
In message "[ruby-list:692] Re: ? for Object#extend"
    on 96/10/01, 石塚圭樹 <keiju@shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです. 

|とりあえず, 私が extend したくなった状況を説明しましょう.

|ビルトインクラスにextendしたいと思ったのは, ソート用のモジュール
|Sortableというのを作っていたからです.

|使い方としては, 以下のような感じです.
|
|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と同時に比較関数を設定します. で, そのあと, 色々な操作がで
|きるようになるというわけです.

これは非常に面白いアイディアだと思いますが,気になる点がいく
つかあります.

まず,extendしてからsortを実行するまで「SortableなのにSortさ
れていない」状態ができますよね.これって望ましくないのでは?

で,次の方が本質的なのですが,多分Sortable#sortでlambdaをつ
くって評価関数として保存する必要があると思うのですが,既に述
べた通りビルトインクラスはインスタンス変数が持てませんから,
この情報を保持する場所が無いような気がします.

昔は全てのオブジェクトがインスタンス変数を持てるようにしてい
たのですが,オブジェクトサイズを削るためビルトインクラスには
持てないようにしてしまったのです.

|まあ, 今のような背景があるわけですが, どうなんですかね? このような形態
|のモジュールはあまり好ましくないということになるのでしょうか?

Mixinの使い方としては非常に面白いと思います.さすが石塚さん.
もう一歩捻ってこういうのはどうでしょう.

a = [1,2,3]
Sortable.new(a) {||e1, e2| e2 <=> e1} # -> a == [3, 2, 1]

Sortable::newは新しいモジュール(Sortableをincludeしている)を
つくってそれでaをextendするわけです.

うーん,ちょっと捻り過ぎのような気もする.

|このモジュール以外の方法としては, Hashクラスのようにキーとオブジェクト
|を分けるやり方もありますが, そういうクラスもこのSortableがあれば簡単に
|実現できるようになります.

ごめんなさい,ここ良く分かりませんでした.

                                まつもと ゆきひろ /:|)

In This Thread

Prev Next