[#3567] Nil is a subclass of Object? — shugo@... (maeda shugo)

前田です。

26 messages 1997/08/02
[#3570] Re: Nil is a subclass of Object? — matz@... (Yukihiro Matsumoto) 1997/08/03

まつもと ゆきひろです

[#3572] Re: Nil is a subclass of Object? — keiju@... (石塚圭樹 ) 1997/08/03

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

[#3573] Re: Nil is a subclass of Object? — matz@... (Yukihiro Matsumoto) 1997/08/03

まつもと ゆきひろです

[#3715] may i make a ruby.rpm? — Shoichi OZAWA <ozawa@...>

こんにちは 小澤@日立 です。

15 messages 1997/08/20

[#3736] module for GNU Readline Library — shugo@... (前田 修吾 / maeda shugo)

前田です。

12 messages 1997/08/20

[#3833] [Bug] Regexp.quote — shugo@... (前田 修吾 / maeda shugo)

前田です。

25 messages 1997/08/26
[#3836] BEGIN and END — Masaki Suketa <suke@...> 1997/08/26

助田です。

[#3837] Re: BEGIN and END — matz@... (Yukihiro Matsumoto) 1997/08/27

まつもと ゆきひろです

[#3842] Re: BEGIN and END — keiju@... (石塚圭樹 ) 1997/08/27

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

[#3839] Re: SyslogSendmail class — takagi@... (TAKAGI Hiromitsu)

> そうですね.本当はこーゆーのが ruby-list の本来の形ですね.

18 messages 1997/08/27
[#3840] Re: SyslogSendmail class — matz@... (Yukihiro Matsumoto) 1997/08/27

まつもと ゆきひろです

[#3852] Re: SyslogSendmail class — keiju@... (石塚圭樹 ) 1997/08/27

けいじゅ@日本ラショナルソフトウェアです.

[#3909] Object#id <=> Fixnum#id2object ? (Re: SyslogSendmail class) — shugo@... (前田 修吾 / maeda shugo) 1997/08/28

前田です。

[#3869] Re: SyslogSendmail class — takagi@... (TAKAGI Hiromitsu)

> Moduleのところに書いてあるんですねえ.こういうノウハウを記述

15 messages 1997/08/27
[#3870] Re: SyslogSendmail class — matz@... (Yukihiro Matsumoto) 1997/08/27

まつもと ゆきひろです

[#3906] document for beginner — toyofuku@...

豊福@パパイヤです。

21 messages 1997/08/28
[#3917] Re: document for beginner — Kikutani Makoto <kikutani@...> 1997/08/29

きくたにです。

[#3925] Re: document for beginner — Masaki Suketa <suke@...> 1997/08/29

助田です

[#3926] Curses (Re: document for beginner) — Kikutani Makoto <kikutani@...> 1997/08/29

Fri, Aug 29, 1997 at 12:54:15PM +0900 において

[#3933] Re: ruby constants — toyofuku@...

豊福@パパイヤです。

16 messages 1997/08/29
[#3934] Re: ruby constants — matz@... (Yukihiro Matsumoto) 1997/08/29

まつもと ゆきひろです

[#3939] Re: ruby constants — WATANABE Hirofumi <watanabe@...> 1997/08/29

わたなべです.

[ruby-list:3709] Re: new sync.rb release

From: shugo@... (前田 修吾 / maeda shugo)
Date: 1997-08-19 04:03:45 UTC
List: ruby-list #3709
前田です。

keiju@bc.mbn.or.jp (石塚圭樹 ) wrote:

|前田さんがいなくて淋しかったです(^^;;;

どうもです:-)

|># Synchronizer呼んでるだけですし(^^;
|
|でも, 面白いですね.
|
|SynchronizableはSynchronizerを利用して(デレゲートタイプの利用ですね)実
|現しているのに対して, 逆に, SyncはSync_mをインクルードして実現していま
|す. 結局同じことを実現するのに反対のやりかたをしています.

まさかSyncがこうなるとは思っていなかったもので(^^;

extend_objectをオーバーライドして初期化処理をしてるんですね。
このワザいただきます:-)
でもincludeした時はやはりinitializeでsyns_extendedしないといけないのか...。
これはincludeをClassで再定義しちゃうしかないのかな。

class Class
   def include(*modules)
      result = super
      modules.each do |mixin|
	 if mixin.respond_to? :__extend_class
	    mixin.__extend_class(self)
	 end
      end
      result
   end
end

module Sync_m
   def Sync_m.__extend_class(klass)
      klass.eval %q{
	 def klass.new(*args)
	    obj = super
	    begin
	       eval "class << obj; @sync_locked; end"
	       obj.extend(For_primitive_object)
	    rescue TypeError
	       obj.extend(For_general_object)
	    end
	    obj
	 end
      }
   end

   module For_primitive_object
      def For_primitive_object.__extend_class(klass)
	 klass.eval %q{
	    def klass.new(*args)
	       obj = super
	       obj.sync_extended
	       Finalizer.add(obj, For_primitive_object, :sync_finalize)
	       obj
	    end
	 }
      end
   end
   
   module For_general_object
      def For_general_object.__extend_class(klass)
	 klass.eval %q{
	    def klass.new(*args)
	       obj = super
	       obj.sync_extended
	       obj
	    end
	 }
      end
   end
end

newを再定義するとまずそうな気がしたのですが、

class Spokesperson < String
   include Sync_m::For_primitive_object
   
   def msg=(msg)
      self[0..-1] = msg
   end
   
   def say
      print self, "\n"
   end
end

p tom = Spokesperson.new("This is message.")
t = Thread.new {
   3.times {
      tom.synchronize {
	 p tom.msg = "This is thread1."
	 sleep(0.3)
	 tom.say
      }
   }
}
3.times {
   tom.synchronize {
      p tom.msg = "This is thread2."
      sleep(0.3)
      tom.say
   }
}
Thread.join t

なんてのも動いてしまいました。
newの引数が違うとちゃんとArgumentErrorになりますね。

-- 
前田 修吾

In This Thread