Merge and update methods help you combine two sets of information into one. They make it easy to add or change data in a hash (a collection of key-value pairs).
Merge and update methods in Ruby
hash1.merge(hash2) # returns a new hash with combined keys and values hash1.merge!(hash2) # updates hash1 with hash2's keys and values hash1.update(hash2) # same as merge! - updates hash1 with hash2
merge returns a new hash and does not change the original.
merge! and update change the original hash directly.
h1 = {a: 1, b: 2}
h2 = {b: 3, c: 4}
new_hash = h1.merge(h2)
puts new_hashh1 = {a: 1, b: 2}
h2 = {b: 3, c: 4}
h1.merge!(h2)
puts h1update works like merge! and changes h1 directly.h1 = {a: 1, b: 2}
h2 = {b: 3, c: 4}
h1.update(h2)
puts h1This program shows how merge creates a new combined hash without changing the original, while update changes the original hash directly.
settings = {volume: 5, brightness: 7}
new_settings = {brightness: 10, contrast: 3}
# Using merge to create a new hash
combined = settings.merge(new_settings)
puts "Combined settings: #{combined}"
# Original settings stay the same
puts "Original settings: #{settings}"
# Using update to change original
settings.update(new_settings)
puts "Updated original settings: #{settings}"If keys overlap, the values from the second hash replace those in the first.
Use merge when you want to keep the original hash unchanged.
Use merge! or update when you want to change the original hash.
merge returns a new hash combining two hashes.
merge! and update change the original hash.
Overlapping keys get their values replaced by the second hash.
Practice
Which Ruby method returns a new hash by combining two hashes without changing the original?
Solution
Step 1: Understand
mergebehaviormergereturns a new hash combining two hashes without modifying the original.Step 2: Compare with
Bothmerge!andupdatemerge!andupdatemodify the original hash, so they don't return a new one.Final Answer:
merge -> Option AQuick Check:
mergereturns new hash [OK]
- Confusing merge and merge! methods
- Thinking update returns a new hash
- Assuming replace merges hashes
Which of the following is the correct syntax to update hash a with hash b in Ruby?
a = {x: 1}b = {y: 2}Solution
Step 1: Check syntax for updating hash
updateis a method that modifies the original hash and takes another hash as argument with parentheses.Step 2: Compare with other options
merge!also updates but usually called with!and parentheses are optional butupdate(b)is the most explicit and correct syntax here.Final Answer:
a.update(b) -> Option DQuick Check:
Useupdate()to modify original hash [OK]
- Using + operator to combine hashes (not valid)
- Forgetting parentheses in method call
- Confusing merge and update syntax
What is the output of this Ruby code?
a = {a: 1, b: 2}b = {b: 3, c: 4}c = a.merge(b)
puts c
Solution
Step 1: Understand
mergebehavior with overlapping keysmergereturns a new hash combining keys; overlapping keys get values from the second hash.Step 2: Apply to given hashes
Key :b is in both hashes; value fromb(3) replaces value froma(2). Keys :a and :c are included as is.Final Answer:
{:a=>1, :b=>3, :c=>4} -> Option CQuick Check:
Overlapping keys replaced by second hash [OK]
- Assuming original hash is changed by merge
- Not replacing overlapping key values
- Missing keys from either hash
Identify the error in this Ruby code snippet:
a = {x: 10}b = {y: 20}a.merge! b
puts a
Solution
Step 1: Check syntax of
merge!method callmerge!can be called without parentheses in Ruby, soa.merge! bis valid syntax.Step 2: Verify runtime behavior
merge!updatesawith keys and values fromb, soabecomes{x: 10, y: 20}. No errors occur.Final Answer:
No error; code works correctly -> Option BQuick Check:
merge!updates original hash without error [OK]
- Thinking parentheses are mandatory
- Assuming merge! returns a new hash
- Expecting runtime error with variable argument
You have two hashes:
h1 = {a: 1, b: 2, c: 3}h2 = {b: 20, d: 4}You want to update h1 with h2 but only keep keys from h2 that have values greater than 10. Which code correctly does this?
Solution
Step 1: Filter
Useh2keys with values > 10select { |k, v| v > 10 }to keep only keys with values greater than 10.Step 2: Update
Useh1with filteredh2updateto modifyh1in place with the filtered hash.Step 3: Check other options
merge!also updates butupdateis clearer;mergereturns new hash and does not modifyh1.Final Answer:
h1.update(h2.select { |k, v| v > 10 }) -> Option AQuick Check:
Filter then update original hash [OK]
- Using merge instead of update (does not modify original)
- Not filtering keys before update
- Using reject incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
