あおきです。

  In mail "[ruby-list:31867] Re: 先祖がえり"
    Koji Arai <JCA02266 / nifty.ne.jp> wrote:

> 新井です。

> > 返すメソッドがある場合、Arrayクラスを継承したMyArrayクラスの
> > オブジェクトに そのまま そのようなメソッドを呼び出すと
> > 先祖がえりして、Arrayを返してしまいます。

> つい最近、修正されました。

> それでも、

> class Bar < Array
> end
> p Bar.new.push(1,2,3)[0,0].type   # => Array
>
> となるのは、まだバグなんじゃないかなっと思うのですが。。。

このへんは RubyGarden にいくつか報告が出ていて、まつもとさんの
コメントも既に付いてるので見てみてください。たとえば RCR38 とか。
そのコメントを簡単にまとめると
「レシーバのクラスを返すべきものも確かにあるが、そうでないものも
  ある。たとえば binary method (+ - * など?)は常に String を返すべき」
だそうです。


ただ、そもそも組み込みクラス (特に String と Array) は可能な限り
継承しないほうがいいでしょう。最初の白川さんの例で言えば、新しい
メソッドの追加だけなので String に直接足してしまってもよさそうです。
あるいはそもそも String のメソッドにすべきでないかもしれません。


というか もしかして話は逆で、String を継承すると妙な振舞いに
なるようにすることで「String は継承するべきでないのだ」という
思想を植え付けようとしているのかも……
-------------------------------------------------------------------
青木峰郎