1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

hash merging with a block ignores non-existing keys altogether

This commit is contained in:
Xavier Noria 2010-06-13 05:06:07 +02:00
parent 9183eaebed
commit 72f9fec607
2 changed files with 17 additions and 18 deletions

View file

@ -131,7 +131,7 @@ module ActiveSupport
def merge!(other_hash)
if block_given?
other_hash.each {|k,v| self[k] = yield(k, self[k], v) }
other_hash.each {|k,v| self[k] = yield(k, self[k], v) if key? k}
else
other_hash.each {|k,v| self[k] = v }
end

View file

@ -144,28 +144,27 @@ class OrderedHashTest < Test::Unit::TestCase
end
def test_merge_with_block
other_hash = ActiveSupport::OrderedHash.new
other_hash['white'] = 'ff'
other_hash['black'] = '00'
merged = @ordered_hash.merge(other_hash) do |key, old_value, new_value|
new_value * 3
hash = ActiveSupport::OrderedHash.new
hash[:a] = 0
hash[:b] = 0
merged = hash.merge(:b => 1, :c => 2) do |key, old_value, new_value|
new_value + 1
end
assert_equal 'ffffff', merged['white']
assert_equal '000000', merged['black']
assert_nil @ordered_hash['white']
assert_nil @ordered_hash['black']
assert_equal 0, merged[:a]
assert_equal 2, merged[:b]
assert !merged.key?(:c)
end
def test_merge_bang_with_block
other_hash = ActiveSupport::OrderedHash.new
other_hash['white'] = 'ff'
other_hash['black'] = '00'
@ordered_hash.merge!(other_hash) do |key, old_value, new_value|
new_value * 3
hash = ActiveSupport::OrderedHash.new
hash[:a] = 0
hash[:b] = 0
hash.merge!(:a => 1, :c => 2) do |key, old_value, new_value|
new_value + 3
end
assert_equal 'ffffff', @ordered_hash['white']
assert_equal '000000', @ordered_hash['black']
assert_equal 4, hash[:a]
assert_equal 0, hash[:b]
assert !hash.key?(:c)
end
def test_shift