[#46807] [ruby-trunk - Bug #7625][Open] Arrayを継承したオブジェクトのcompactがArrayを返す — "mogya@... (Daisuke Furukawa)" <mogya@...>

19 messages 2012/12/26

[#46822] [ruby-trunk - Feature #7639][Open] More freedom for location of comments — "sawa (Tsuyoshi Sawada)" <sawadatsuyoshi@...>

14 messages 2012/12/30

[ruby-dev:46809] [ruby-trunk - Bug #7625][Assigned] Arrayを継承したオブジェクトのcompactがArrayを返す

From: "shugo (Shugo Maeda)" <redmine@...>
Date: 2012-12-26 15:15:58 UTC
List: ruby-dev #46809
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

前田です。

[email protected] (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: [email protected] (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/

In This Thread