From: "ddebernardy (Denis de Bernardy)" Date: 2012-11-09T02:32:10+09:00 Subject: [ruby-core:49118] [ruby-trunk - Bug #6037] #freeze bug Issue #6037 has been updated by ddebernardy (Denis de Bernardy). Adding a note in case someone new to ruby ever wonders why it got rejected. >> array = ['a', 'b'].freeze => ["a", "b"] >> puts array.map { |o| o.object_id } 70282007609720 70282007609700 => nil >> array[0].gsub!(/.+/s, 'b') => "b" >> puts array.map { |o| o.object_id } 70282007609720 70282007609700 >> array.map { |o| o.gsub!(/.+/s, 'c') } => ["c", "c"] >> puts array.map { |o| o.object_id } 70282007609720 70282007609700 => nil In other words, `gsub!` for an array is equivalent to calling `map { |o| o.gsub! ... }`. ---------------------------------------- Bug #6037: #freeze bug https://bugs.ruby-lang.org/issues/6037#change-32650 Author: ddebernardy (Denis de Bernardy) Status: Rejected Priority: Normal Assignee: Category: Target version: ruby -v: 1.9.3 freeze should deep freeze, to avoid inconsistent behavior: array = ['a', 'b'].freeze array[0] = 'b' array[0].gsub!(/.+/s, 'b') array >> RUBY_VERSION => "1.9.3" >> array = ['a', 'b'].freeze => ["a", "b"] >> array[0] = 'b' RuntimeError: can't modify frozen Array from (irb):269:in `[]=' from (irb):269 from /opt/local/bin/irb:12:in `
' >> array[0].gsub!(/.+/s, 'b') => "b" >> array => ["b", "b"] -- http://bugs.ruby-lang.org/