Issue #9729 has been updated by Usaku NAKAMURA.
Backport changed from 2.0.0: REQUIRED, 2.1: DONE to 2.0.0: DONE, 2.1:
DONE
backported into ruby_2_0_0
at r46747.
Bug #9729: Hash#each が無限ループする
- Author: 三村 益隆
- Status: Closed
- Priority: Normal
- Assignee: Masaya T.
- Category: core
- Target version: current: 2.2.0
- ruby -v: ruby 2.2.0dev (2014-04-11 trunk 45566) [x86_64-darwin13]
- Backport: 2.0.0: DONE, 2.1: DONE
Hash のキーに配列を使い、
キーが同じ値になるように以下のような操作をすると
Hash#each が無限ループします。
h = {}
h[[]] = 1 # h #=> {[] => 1}
h.keys[0] << 1 # h #=> {[1] => 1}
h[[]] = 1 # h #=> {[1] => 1, [] => 1}
h.keys[1] << 1 # h #=> {[1] => 1, [1] => 1}
h.each { 1 } # 無限ループ
このコードは、Ruby 1.9.3-p545 だと、無限ループにならないことを確認しています。
また、以下のような手順で {[1] => 1, [1] => 1} を作った場合は、無限ループになりませんでした。
h = {}
h[[]] = 1 # h #=> {[] => 1}
h[[1]] = 1 # h #=> {[] => 1}
h.keys[0] << 1 # h #=> {[1] => 1, [1] => 1}
h.each { 1 } # 無限ループにならない