📖 Scenario: Imagine you have a simple Ruby object representing a book in a library system. You want to create copies of this book object to make changes without affecting the original.
🎯 Goal: You will learn how to create copies of an object using dup and clone methods in Ruby, and observe the differences between them.
📋 What You'll Learn
Create a Ruby class called Book with attributes title and author
Create an instance of Book with specific values
Create copies of the book object using dup and clone
Print the original and copied objects to compare
💡 Why This Matters
🌍 Real World
Copying objects is useful when you want to work with similar data without changing the original, like duplicating a book record to edit details safely.
💼 Career
Understanding object copying helps in Ruby programming for tasks like caching, undo features, or managing state without side effects.
Progress0 / 4 steps
1
Create the Book class and an instance
Create a Ruby class called Book with an initialize method that takes title and author as parameters and sets them as instance variables. Then create an instance called original_book with title set to "The Ruby Way" and author set to "Hal Fulton".
Ruby
Hint
Use attr_accessor for title and author. Initialize instance variables in initialize. Create original_book with given values.
2
Create copies using dup and clone
Create two new variables: dup_book by calling original_book.dup and clone_book by calling original_book.clone.
Ruby
Hint
Use dup and clone methods on original_book to create copies.
3
Modify the copies' attributes
Change the title of dup_book to "The Ruby Way - Dup" and the title of clone_book to "The Ruby Way - Clone".
Ruby
Hint
Assign new strings to the title attribute of dup_book and clone_book.
4
Print the titles of all books
Print the title of original_book, dup_book, and clone_book each on a new line using puts.
Ruby
Hint
Use puts to print the title of each book object on separate lines.
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
Step 1: Understand what dup copies
dup creates a shallow copy but does not copy frozen state or singleton methods.
Step 2: Understand what clone copies
clone copies everything including frozen state and singleton methods.
Final Answer:
clone copies frozen state and singleton methods; dup does not. -> Option A
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
Step 1: Identify the method call syntax
In Ruby, dup is called on the object as obj.dup or obj.dup().
Step 2: Check other options
clone is a different method, dup(obj) and copy() are invalid.
Final Answer:
copy = obj.dup() -> Option A
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
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".
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".
Final Answer:
Hello
Hello -> Option D
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
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
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.
Step 2: Check frozen state of copy
Since dup skips frozen state, copy.frozen? returns false.
Final Answer:
false -> Option B
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
Step 1: Identify method that copies singleton methods and frozen state
dup skips frozen state and singleton methods, so it is not suitable.
Step 2: Confirm clone behavior
clone copies both singleton methods and frozen state automatically.
Final Answer:
Use obj.clone because it copies both singleton methods and frozen state. -> Option C
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 unknownstrongwhile earning +1 Grip toward your certificate.