まつもと ゆきひろです

In message "[ruby-dev:10085] Re: [PATCH] module === string.extend(module).dup"
    on 00/06/19, nobu.nakada / nifty.ne.jp <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では複製されるいくつか
「状態」について、これは複製したいがこれは複製したくないとい
う中田さんのような希望をどのようにかなえるべきかについては、
それはそれで別に議論したいです。

                                まつもと ゆきひろ /:|}