From: "shugo (Shugo Maeda)" Date: 2012-12-27T00:15:58+09:00 Subject: [ruby-dev:46809] [ruby-trunk - Bug #7625][Assigned] Arrayを継承したオブジェクトのcompactがArrayを返す Issue #7625 has been updated by shugo (Shugo Maeda). Category set to DOC Status changed from Open to Assigned Assignee set to matz (Yukihiro Matsumoto) Target version set to 2.0.0 前田です。 mogya@mogya.com (Daisuke Furukawa) wrote: > 現象: >  ruby 1.9.3で、Arrayを継承したクラスのcompactメソッドを呼び出したとき、 > Arrayクラスのオブジェクトが帰ってくる この変更自体は、r30148で導入された意図的な変更だと思います。 * array.c (rb_ary_dup): should copy contents only. no instance variable, no class would be copied. it would affect methods #sort, #reject, #transpose, #uniq, #compact, and #shuffle. [ruby-core:33640] ただ、まつもとさんが http://bugs.ruby-lang.org/issues/4136#note-7 でflattenなどは サブクラスのインスタンスを返すという指摘に対し、 If a method is originally defined in Enumerable, i.e. its return value (Array) is a collection of values from enumerable. (snip) I don't think so. #flatten is not an enumerable method. Please point out if we missed some other methods. と言っているんですが、compact/uniq/transpose/shuffleもEnumerableでもともと定義されて いないですよね。 このあたりの一貫性の無さを正当化するような理由はあるでしょうか? > まつもとさん とくに理由がないのであれば、これらのメソッドはサブクラスのインスタンスを返すようにするか、flattenなども Arrayを返すようにした方がよいのではないかと思います。 ---------------------------------------- Bug #7625: Arrayを継承したオブジェクトのcompactがArrayを返す https://bugs.ruby-lang.org/issues/7625#change-35097 Author: mogya@mogya.com (Daisuke Furukawa) Status: Assigned Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: DOC 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/