サイドバー置くのもダサくなってきたような気がするので日記からは撤去、その代わり http://www.hsbt.org のトップページをプロフィール的なページにしてみた。まだまだ Hiki と tDiary で十分だ。
変わったというか regression です。原因は @sora_h が特定してくれたので、2.1.2 では 2.1.0 の挙動に戻るでしょう。
どういうことかというと
class ExtHash < Hash; end
h = ExtHash.new
h[:a] = :b
p h.class
p h.reject{|k, _| k == :a}.class
みたいなコードがあったときに
$ ruby -v foo.rb
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]
ExtHash
foo.rb:7: warning: copying unguaranteed attributes: {:a=>:b}
foo.rb:7: warning: following atributes will not be copied in the future version:
foo.rb:7: warning: subclass: ExtHash
ExtHash
$ ruby -v foo.rb
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]
ExtHash
Hash
というように、reject が返すクラスが plain Hash となってしまった。これは 2.1.0 で入れるかどうか @nurse さんと話しあった結果、ActiveSupport の HashWithIndifferentAccess への影響が大きいから warn だけにしてやめようというのが backport が不完全で発生してしまったというのが原因。
とはいえ、2.2.0 では 2.1.1 の挙動になるので、継承したクラスのrejectが返すクラスが、同じクラスとなるということを期待するコードを書いたら将来的には死にます。
rails では 4.0 に workaround が入ったみたいだけど、3.2 では入ってないのでこういうのを期待したコードを書いている、書く恐れがある人はモンキーパッチで頑張りましょう。
この辺の errata は何処でアナウンスするのが良いのかなあ、www.ruby-lang.org だとちょっとニュースリリース力が強すぎるので、別の場所を探したい。
詳報です http://diary.sorah.jp/2014/02/28/ruby211-hash-reject
ありがたやありがたや。