けいじゅ@日本ラショナルです.

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 <<---