From: nobu.nakada@... Date: 2000-06-21T08:02:08+09:00 Subject: [ruby-dev:10097] Re: [PATCH] module === string.extend(module).dup なかだです。 At Wed, 21 Jun 2000 02:11:51 +0900, matz@netlab.co.jp (Yukihiro Matsumoto) wrote: > |> そういう時にはdupでなくcloneを使うもんだと想定してるんですが。 > |> dupは同内容の文字列オブジェクトを作るメソッドで、cloneは > |> (extendなども含めて)コピーを作るメソッドです。 > | > | extend してるけど freeze はしてないコピー、ってのが欲しかった > |んですが、帯に短したすきに長しで。 > > むむむ。良く考えてみるとこれはなかなかに問題です。というのも > > clone 状態や特異メソッドも含めて元オブジェクトの完全な複製 > dup オブジェクトの内容のみのコピー。状態は複製しない > > というのが、私の意図していたcloneとdupの挙動なのです。freeze > も特異メソッドも私の分類ではどちらも状態ですから、どちらかだ > けをコピーと言うのは考えてませんでした。 なるほど。たしかに、こっちは欲しいけどあっちはいらない、とい うのもヘンなのかもしれません。 > しかし、実際の挙動は > > | 他のオブジェクトは dup でも extend されるもんで、String もし > |てもいいかなと。 > > になっているわけです(具体的にはObjectとArrayとHash)。しかも、 > これはcloneと違って、複製後に元のオブジェクトに特異メソッド > を追加すると自動的にdupされたオブジェクトにも追加されるとい > うオマケ付き。 これには気づきませんでしたが、T_ICLASS を共有してるせいですか。 > はっきり言うと、これは私の意図ではなくバグです。特異メソッド > はあるオブジェクト固有のメソッドですから、複数のオブジェクト > から共有されてはマズイです。 > > ちゅーことで、他のオブジェクトでもdupではextendされないこと > にすべきだと思いますし、そのように修正しようと思います。なん > だか中田さんの希望とは反対方向ですね。 いや、どっちかに揃ってればいーです。 > でもって、dupでは複製されないが、cloneでは複製されるいくつか > 「状態」について、これは複製したいがこれは複製したくないとい > う中田さんのような希望をどのようにかなえるべきかについては、 > それはそれで別に議論したいです。 こういうのだと、frozen なオブジェクトじゃダメでした。 Kernel#included_modules とか extended_modules とかいうのがあれば、うま く行きそうなんですが。 module Duplicator def included_modules class << self; included_modules end end def duplicate n = self.dup included_modules.each {|m| n.extend(m)} n end end x = "xyz".extend(Duplicator) y = x.duplicate z = y.duplicate -- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦