From: pegacorn@... Date: 2004-10-11T16:09:02+09:00 Subject: [ruby-dev:24465] Re: DelegateClass(superclass)#clone From: pegacorn@jcom.home.ne.jp Date: Mon, 11 Oct 2004 10:39:08 +0900 Message-Id: <20041011.103446.59461857.pegacorn@jcom.home.ne.jp> /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > DelegateClass を継承したクラスの clone は、 ^^^^^^^^^^^^^ DelegateClass(superclass)の間違いですね。 > 以下のようになるべきだと思うのですが、 > いかがでしょうか? > # delegate.rb をどう修正して良いかはわからないのですが… 一応自分なりに delegate.rb を修正してみました。 これで、先のテストケースはうまくいきます。 # なぜ、元の delegate.rb で、DelegateClass(superclass) を継承した # クラスが __getobj__ にアクセスできていたのか理解できていませんが… --- delegate.rb.ORG Tue Dec 16 07:33:25 2003 +++ delegate.rb Mon Oct 11 07:02:40 2004 @@ -107,9 +107,27 @@ raise NameError, "invalid identifier %s" % method, caller(3) end end + klass.module_eval <<-EOS def __getobj__ @_dc_obj end + def __setobj__(obj) + @_dc_obj = obj + end + protected :__getobj__, :__setobj__ + alias _org_clone clone + def clone + clone_obj = self._org_clone + clone_obj.__setobj__(@_dc_obj.clone) + clone_obj + end + alias _org_dup dup + def dup + dup_obj = self._org_dup + dup_obj.__setobj__(@_dc_obj.dup) + dup_obj + end + EOS return klass; end ---- 馬越