Bird
Raised Fist0
Rubyprogramming~20 mins

Object#dup and Object#clone in Ruby - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Ruby Object Copy Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Difference in frozen state after dup and clone
What is the output of the following Ruby code?
Ruby
str = "hello"
frozen_str = str.freeze
copy_dup = frozen_str.dup
copy_clone = frozen_str.clone
puts copy_dup.frozen?
puts copy_clone.frozen?
A
true
false
B
false
true
C
true
true
D
false
false
Attempts:
2 left
💡 Hint
Remember that dup does not copy the frozen state, but clone does.
❓ Predict Output
intermediate
2:00remaining
Effect of modifying singleton methods after dup and clone
What will be the output of this Ruby code?
Ruby
obj = Object.new
def obj.greet; "hello"; end
obj_dup = obj.dup
obj_clone = obj.clone
puts obj_dup.respond_to?(:greet)
puts obj_clone.respond_to?(:greet)
A
true
true
B
false
false
C
false
true
D
true
false
Attempts:
2 left
💡 Hint
Singleton methods are copied by clone but not by dup.
🔧 Debug
advanced
3:00remaining
Why does modifying a duped object affect the original?
Consider this Ruby code snippet. Why does modifying the duped object also change the original object?
Ruby
class Person
  attr_accessor :name, :address
end

person1 = Person.new
person1.name = "Alice"
person1.address = { city: "NY" }
person2 = person1.dup
person2.address[:city] = "LA"
puts person1.address[:city]
ABecause dup creates a shallow copy, so nested objects like the address hash are shared.
BBecause dup creates a deep copy, so changes to person2 do not affect person1.
CBecause the address hash is frozen and cannot be changed.
DBecause the name attribute is not copied by dup.
Attempts:
2 left
💡 Hint
Think about how dup copies nested objects.
📝 Syntax
advanced
2:00remaining
Which code raises an error when cloning a frozen object?
Which of the following Ruby code snippets will raise a RuntimeError when cloning a frozen object?
A
obj = Object.new.freeze
obj.clone
B
obj = "text".freeze
obj.dup
C
obj = "text".freeze
obj.clone
D
obj = Object.new.freeze
obj.dup
Attempts:
2 left
💡 Hint
Cloning a frozen object of some classes raises an error, but dup usually does not.
🚀 Application
expert
3:00remaining
How to create a deep copy of an object with nested mutable state?
Given a Ruby object with nested mutable objects, which approach correctly creates a deep copy so that modifying nested objects in the copy does not affect the original?
AUse obj.clone to copy the object and its nested objects.
BUse obj.dup to copy the object and its nested objects.
CUse obj.freeze before duplicating to prevent changes.
DUse Marshal.load(Marshal.dump(obj)) to serialize and deserialize the object.
Attempts:
2 left
💡 Hint
Think about how to copy nested objects deeply in Ruby.

Practice

(1/5)
1. What is the main difference between dup and clone in Ruby?
easy
A. clone copies frozen state and singleton methods; dup does not.
B. dup copies frozen state and singleton methods; clone does not.
C. dup creates a deep copy; clone creates a shallow copy.
D. clone only copies instance variables; dup copies the entire object.

Solution

  1. Step 1: Understand what dup copies

    dup creates a shallow copy but does not copy frozen state or singleton methods.
  2. Step 2: Understand what clone copies

    clone copies everything including frozen state and singleton methods.
  3. Final Answer:

    clone copies frozen state and singleton methods; dup does not. -> Option A
  4. Quick Check:

    clone copies all [OK]
Hint: Remember: clone copies everything, dup skips frozen and singleton [OK]
Common Mistakes:
  • Thinking dup copies frozen state
  • Confusing shallow and deep copy
  • Assuming clone skips singleton methods
2. Which of the following is the correct syntax to create a copy of an object obj using dup?
easy
A. copy = obj.dup()
B. copy = dup(obj)
C. copy = obj.clone()
D. copy = obj.copy()

Solution

  1. Step 1: Identify the method call syntax

    In Ruby, dup is called on the object as obj.dup or obj.dup().
  2. Step 2: Check other options

    clone is a different method, dup(obj) and copy() are invalid.
  3. Final Answer:

    copy = obj.dup() -> Option A
  4. Quick Check:

    Use obj.dup() to copy [OK]
Hint: Call dup as a method on the object: obj.dup() [OK]
Common Mistakes:
  • Using clone instead of dup
  • Trying dup(obj) as a function
  • Using non-existent copy() method
3. What will be the output of the following Ruby code?
class MyClass
  def greet
    "Hello"
  end
end

obj = MyClass.new
obj_singleton = obj.clone

def obj_singleton.greet
  "Hi"
end

copy1 = obj.dup
copy2 = obj.clone

puts copy1.greet
puts copy2.greet
medium
A. Error at runtime
B. Hello Hi
C. Hi Hi
D. Hello Hello

Solution

  1. Step 1: Understand singleton method copying

    Singleton methods are copied by clone but not by dup. Here, obj_singleton has a singleton method greet returning "Hi".
  2. Step 2: Check what copy1 and copy2 get

    copy1 = obj.dup does not copy singleton methods, so copy1.greet calls original method returning "Hello".
    copy2 = obj.clone copies singleton methods only from obj, not from obj_singleton. Since obj has no singleton method, copy2.greet returns "Hello".
  3. Final Answer:

    Hello Hello -> Option D
  4. Quick Check:

    dup and clone copy singleton only from original object [OK]
Hint: Singleton methods copy only from original object, not clones [OK]
Common Mistakes:
  • Assuming clone copies singleton methods from clones
  • Thinking dup copies singleton methods
  • Expecting 'Hi' output from copy2
4. Consider this Ruby code snippet:
str = "hello"
str.freeze
copy = str.dup
puts copy.frozen?
What is the output and why? If there is an error, identify and fix it.
medium
A. true
B. false
C. NoMethodError
D. RuntimeError

Solution

  1. Step 1: Understand freezing and dup behavior

    The string str is frozen. When dup is called, it copies the object but does NOT copy the frozen state.
  2. Step 2: Check frozen state of copy

    Since dup skips frozen state, copy.frozen? returns false.
  3. Final Answer:

    false -> Option B
  4. Quick Check:

    dup skips frozen state, so frozen? = false [OK]
Hint: dup skips frozen state, clone keeps it [OK]
Common Mistakes:
  • Expecting copy to be frozen
  • Confusing frozen? method with freeze
  • Assuming dup raises error on frozen objects
5. You have an object obj with singleton methods and it is frozen. You want to create a copy that preserves both the singleton methods and the frozen state. Which method should you use and why?
hard
A. Use obj.dup because it copies singleton methods but not frozen state.
B. Use obj.dup and then manually freeze the copy.
C. Use obj.clone because it copies both singleton methods and frozen state.
D. Use obj.clone and then manually add singleton methods.

Solution

  1. Step 1: Identify method that copies singleton methods and frozen state

    dup skips frozen state and singleton methods, so it is not suitable.
  2. Step 2: Confirm clone behavior

    clone copies both singleton methods and frozen state automatically.
  3. Final Answer:

    Use obj.clone because it copies both singleton methods and frozen state. -> Option C
  4. Quick Check:

    clone copies all including frozen and singleton [OK]
Hint: clone copies frozen state and singleton methods together [OK]
Common Mistakes:
  • Using dup and expecting frozen state copied
  • Manually adding singleton methods after clone
  • Freezing after dup instead of cloning
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard