From: "shugo (Shugo Maeda)" Date: 2013-02-08T14:03:40+09:00 Subject: [ruby-dev:46950] [ruby-trunk - Bug #7625] Arrayを継承したオブジェクトのcompactがArrayを返す Issue #7625 has been updated by shugo (Shugo Maeda). mame (Yusuke Endoh) wrote: > > ただ、ArrayにあってEnumerableにないメソッドはレシーバーのクラスを返したほうが良いと思います。 > > たまたま現在の挙動が matz の好みということになります。 いや、そうなっていないと思います。 $ ./ruby -ve 'class Foo < Array; end; p Foo[2,1,3].sort.class' ruby 2.0.0dev (2013-02-08 trunk 39154) [i686-linux] Foo sortはEnumerableにもあるメソッドなので、まつもとさんの考えでは常にArrayを返す べきということになると思います。 # 将来ArrayにしかないメソッドがEnumerableにも追加されたらどうするかとか考える # と、本当にまつもとさんの方針でよいのかもちょっと検討の余地があるように思いますが。 > 2.0.0-rc2 はその挙動でいきましょう。それで重大な問題が報告されなければ、p0 もそのままで。 > なお、rails 等に影響を与えない公算が高いと思っています (1.9.2 と同じ挙動のはずなので) 。 現状まつもとさんの意図が正しく反映されているか疑問ですので、r39004はいったん revertすべきだと思います。 これがバグ修正扱いなのであれば2.0.0が出た後で直してもよいと思いますし、仕様変更 なのであれば今さら入るのはおかしいのではないですか? ---------------------------------------- Bug #7625: Arrayを継承したオブジェクトのcompactがArrayを返す https://bugs.ruby-lang.org/issues/7625#change-36038 Author: mogya@mogya.com (Daisuke Furukawa) Status: Assigned Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: core Target version: 2.0.0 ruby -v: ruby 1.9.3p362 (2012-12-25 revision 38607) [x86_64-linux] 現象:  ruby 1.9.3で、Arrayを継承したクラスのcompactメソッドを呼び出したとき、 Arrayクラスのオブジェクトが帰ってくる 期待している結果 継承したクラスのオブジェクトが帰ってくる 再現コード ======== $ ruby -v ruby 1.9.2p320 (2012-04-20 revision 35421) [i686-linux] $ irb irb(main):001:0> class Array2 < Array; end irb(main):002:0> p Array2.new().compact.class.name "Array2" ======== $ ruby -v ruby 1.9.3p362 (2012-12-25 revision 38607) [x86_64-linux] $ irb irb(main):001:0> class Array2 < Array; end irb(main):002:0> p Array2.new().compact.class.name "Array" ======== 他に調べたこと ・ruby 1.9.3p327も、p362 と同じ挙動でした ・compactの代わりにuniqを使っても同様の問題が発生 ・1.9.3でも、Stringクラスを使って   s = String2.new().concat("") だとString2クラスのオブジェクトが帰ってきてます see also: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/49098 -- http://bugs.ruby-lang.org/