[#46908] [ruby-trunk - Bug #7774][Assigned] IFUNC上のbinding呼び出しでSEGV — "ktsj (Kazuki Tsujimoto)" <kazuki@...>

16 messages 2013/02/03

[#47075] [ruby-trunk - Bug #7924][Open] r39232 以降 net/http で正しく reponse を取得出来ないケースがある — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>

15 messages 2013/02/23

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

From: "shugo (Shugo Maeda)" <redmine@...>
Date: 2013-02-08 05:03:40 UTC
List: ruby-dev #46950
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: [email protected] (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/

In This Thread