From: matz@... (Yukihiro Matsumoto) Date: 2000-06-21T02:11:51+09:00 Subject: [ruby-dev:10096] Re: [PATCH] module === string.extend(module).dup まつもと ゆきひろです In message "[ruby-dev:10085] Re: [PATCH] module === string.extend(module).dup" on 00/06/19, nobu.nakada@nifty.ne.jp writes: |> そういう時にはdupでなくcloneを使うもんだと想定してるんですが。 |> dupは同内容の文字列オブジェクトを作るメソッドで、cloneは |> (extendなども含めて)コピーを作るメソッドです。 | | extend してるけど freeze はしてないコピー、ってのが欲しかった |んですが、帯に短したすきに長しで。 むむむ。良く考えてみるとこれはなかなかに問題です。というのも clone 状態や特異メソッドも含めて元オブジェクトの完全な複製 dup オブジェクトの内容のみのコピー。状態は複製しない というのが、私の意図していたcloneとdupの挙動なのです。freeze も特異メソッドも私の分類ではどちらも状態ですから、どちらかだ けをコピーと言うのは考えてませんでした。 しかし、実際の挙動は | 他のオブジェクトは dup でも extend されるもんで、String もし |てもいいかなと。 になっているわけです(具体的にはObjectとArrayとHash)。しかも、 これはcloneと違って、複製後に元のオブジェクトに特異メソッド を追加すると自動的にdupされたオブジェクトにも追加されるとい うオマケ付き。 はっきり言うと、これは私の意図ではなくバグです。特異メソッド はあるオブジェクト固有のメソッドですから、複数のオブジェクト から共有されてはマズイです。 ちゅーことで、他のオブジェクトでもdupではextendされないこと にすべきだと思いますし、そのように修正しようと思います。なん だか中田さんの希望とは反対方向ですね。 でもって、dupでは複製されないが、cloneでは複製されるいくつか 「状態」について、これは複製したいがこれは複製したくないとい う中田さんのような希望をどのようにかなえるべきかについては、 それはそれで別に議論したいです。 まつもと ゆきひろ /:|}