From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-08-20T12:17:36+09:00 Subject: [ruby-list:3711] Re: new sync.rb release けいじゅ@日本ラショナルです. In [ruby-list :03709 ] the message: "[ruby-list:3709] Re: new sync.rb release ", on Aug/19 13:03(JST) shugo@po.aianet.ne.jp (前田 修吾/ maeda shugo) writes: >前田です。 >|前田さんがいなくて淋しかったです(^^;;; >どうもです:-) 復活するなりすごいものを出してきましたねえ(@@;;; >|SynchronizableはSynchronizerを利用して(デレゲートタイプの利用ですね)実 >|現しているのに対して, 逆に, SyncはSync_mをインクルードして実現していま >|す. 結局同じことを実現するのに反対のやりかたをしています. > >まさかSyncがこうなるとは思っていなかったもので(^^; 新版Mutex_m を作った時から, Mutexもこのようにして実現できると思ってい たのもありますし, 結構複雑なので2つ同じようなものは必要ないと思いまし たし... # Mutex_m::For_primitive_objectとMutex_m::For_general_objectは, 同じア # ルゴリズムを含んでしますが, Sync_m::XX では, polymorphを使って1つに # まとめました(^^;;; >extend_objectをオーバーライドして初期化処理をしてるんですね。 >このワザいただきます:-) あ? これは, 前から公開されているんですけどね. ここでは, 実際にextendす るクラスをすり替えてしまっているところが技ですね(^^;;; >でもincludeした時はやはりinitializeでsyns_extendedしないといけないのか...。 >これはincludeをClassで再定義しちゃうしかないのかな。 ああ. includeして利用することを考えてなかったもので, includeには全然対 応できていないですね(^^;;; >class Class (ここから省略) >Thread.join t > >なんてのも動いてしまいました。 >newの引数が違うとちゃんとArgumentErrorになりますね。 なかなかものすごいですね(@@;;;; こういうプログラム非常に好みなんですが... とはいえ, 気になる点が少しあります. 1. includeをoverrideするのはちょっと... 以前, extendと同様にincludeもフックが欲しいという話しがあったのですが, 結局採用になりませんでした. このような大きな変更にはrubyの作者の意向に したがった方が良いんじゃないかなあ... という思いがあります. # 元メイルが見つからん... extendのhookの話しは見つかったのですが... # 再度議論して仕様に入れてもらうというてもありますが(^^;;; とはいえ includeで Sync_m::For_primitive_object はすかないので, class Spokesperson < String Sync_m.included_to self # or inclued Sync_m.includable こんな感じのインターフェイスになってしまいますが... ところで, 前田さんのは: >class Spokesperson < String > include Sync_m::For_primitive_object としていますが, class Spokesperson < String include Sync_m としても動作しますよね? この辺りは, include-hookの効果が出てていいとこ ろですねえ... # やはり, include-hookが欲しいなあ >>> 松本クーン!! 2. superが使える 前田さんのプログラムは, include時にnewをoverrideしていますが, ここまで は必要ないんじゃないでしょうか? 通常, インスタンスの初期化時に, 上位クラスでの初期化を行いたい場合は superを使うことになっているので, superで初期化できるようになっていれば 文句はないと思います. ということで, class Spokesperson < String Sync_m.included_to self def Spokesperson.new super.new.initialize end # String newはinitializeしてくれないらしいので追加, 一般クラスなら # ば必要なし #def ininitalize # super #end # newをoverrideしているので必要なし. 一般クラスの場合こちらが必要. end というインターフェイスでは不満でしょうか? __ ..........................................石塚 圭樹@日本ラショナル... ----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---