トップ «前の日記(2014/03/01 (土) ) 最新 次の日記(2014/03/03 (月) )» 編集 RSS feed

HsbtDiary


2014/03/02 (日) [長年日記]

hsbt.org のデザインとかちょっと変更

サイドバー置くのもダサくなってきたような気がするので日記からは撤去、その代わり http://www.hsbt.org のトップページをプロフィール的なページにしてみた。まだまだ Hiki と tDiary で十分だ。

[ruby][rails] Ruby 2.1.1 で Hash を継承したクラスの reject の挙動が変わった

変わったというか 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 だとちょっとニュースリリース力が強すぎるので、別の場所を探したい。

本日のツッコミ(全2件) [ツッコミを入れる]
# sorah (2014/03/02 (日) 15:21)

詳報です http://diary.sorah.jp/2014/02/28/ruby211-hash-reject

# hsbt (2014/03/02 (日) 15:51)

ありがたやありがたや。