あおきです。
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 は継承するべきでないのだ」という
思想を植え付けようとしているのかも……
-------------------------------------------------------------------
青木峰郎