[ruby-trunk - Bug #9729] Hash#each が無限ループする

Issue #9729 has been updated by Tomoyuki C…

Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: REQUIRED,
2.1: DONE

Backported into ruby_2_1 branch at r46721.


Bug #9729: Hash#each が無限ループする
https://bugs.ruby-lang.org/issues/9729#change-47607

  • 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: REQUIRED, 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 }   # 無限ループにならない

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs