From: usa@... Date: 2014-07-02T07:12:22+00:00 Subject: [ruby-dev:48359] [ruby-trunk - Bug #9729] Hash#each が無限ループする Issue #9729 has been updated by Usaku NAKAMURA. Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED ---------------------------------------- Bug #9729: Hash#each が無限ループする https://bugs.ruby-lang.org/issues/9729#change-47541 * Author: 三村 益隆 * Status: Closed * Priority: Normal * Assignee: Masaya Tarui * 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: REQUIRED, 2.1: REQUIRED ---------------------------------------- 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 } # 無限ループにならない ~~~ -- https://bugs.ruby-lang.org/