📖 Scenario: Imagine you want to create different types of animals dynamically in a program. Instead of writing separate classes for each animal, you can create classes on the fly using Class.new.
🎯 Goal: You will create a dynamic class for an animal, add a method to it, and then create an instance to call that method.
📋 What You'll Learn
Create a dynamic class using Class.new and assign it to a variable called Animal.
Add a method called speak inside the dynamic class that returns the string "Hello from Animal".
Create an instance of the Animal class and assign it to a variable called animal_instance.
Print the result of calling the speak method on animal_instance.
💡 Why This Matters
🌍 Real World
Dynamic class creation is useful when you need to generate classes on the fly based on user input or configuration, such as creating different types of objects without writing separate class files.
💼 Career
Understanding dynamic class creation helps in metaprogramming, which is a powerful technique used in Ruby on Rails and other Ruby frameworks to write flexible and reusable code.
Progress0 / 4 steps
1
Create a dynamic class called Animal
Write a line of code that creates a new class dynamically using Class.new and assigns it to a variable called Animal.
Ruby
Hint
Use Animal = Class.new to create a new class and assign it to Animal.
2
Add a method speak to the Animal class
Add a method called speak inside the Animal class that returns the string "Hello from Animal". Use Animal.class_eval and define the method inside the block.
Ruby
Hint
Use Animal.class_eval do ... end to add methods to the dynamic class.
3
Create an instance of Animal
Create an instance of the Animal class and assign it to a variable called animal_instance.
Ruby
Hint
Use animal_instance = Animal.new to create the instance.
4
Print the result of calling speak on animal_instance
Write a line of code to print the result of calling the speak method on animal_instance.
Ruby
Hint
Use puts animal_instance.speak to print the message.
Practice
(1/5)
1. What does Class.new do in Ruby?
easy
A. Defines a method inside a class
B. Deletes an existing class
C. Creates a new instance of a class
D. Creates a new class dynamically at runtime
Solution
Step 1: Understand the purpose of Class.new
Class.new is used to create a new class dynamically while the program runs, without writing a full class definition.
Step 2: Differentiate from other options
It does not delete classes, create instances, or define methods alone. It creates a new class object.
Final Answer:
Creates a new class dynamically at runtime -> Option D
Quick Check:
Class.new = dynamic class creation [OK]
Hint: Class.new always creates a new class object [OK]
Common Mistakes:
Confusing class creation with instance creation
Thinking it deletes or modifies existing classes
Assuming it only defines methods
2. Which of the following is the correct syntax to create a new class with Class.new and add a method greet that returns "Hello"?
easy
A. MyClass = Class.new do def greet return "Hello" end end
B. MyClass = Class.new { greet() = "Hello" }
C. MyClass = Class.new { def greet; "Hello"; end }
D. MyClass = Class.new { def greet() puts "Hello" }
Solution
Step 1: Check correct block syntax for Class.new
The block can be given with curly braces or do-end. Inside, method definitions use def method_name; ...; end.
Step 2: Validate method definition and return value
MyClass = Class.new { def greet; "Hello"; end } correctly defines greet returning "Hello". MyClass = Class.new do def greet return "Hello" end end is correct syntax but missing the 'end' for the block in MyClass = Class.new do def greet return "Hello" end end, so MyClass = Class.new do def greet return "Hello" end end is invalid as given. MyClass = Class.new { greet() = "Hello" } uses invalid method syntax. MyClass = Class.new { def greet() puts "Hello" } uses puts which prints but does not return the string.
Final Answer:
MyClass = Class.new { def greet; "Hello"; end } -> Option C
Hint: Use def inside Class.new block with proper syntax [OK]
Common Mistakes:
Using puts instead of returning a string
Incorrect block syntax for Class.new
Invalid method definition syntax
3. What will be the output of this Ruby code?
MyClass = Class.new do
def greet
"Hi"
end
end
obj = MyClass.new
puts obj.greet
medium
A. Hi
B. Hello
C. Error: undefined method greet
D. nil
Solution
Step 1: Understand class creation and method definition
The code creates a new class with a method greet returning "Hi".
Step 2: Create instance and call method
Creating an instance obj and calling obj.greet returns "Hi" which is printed.
Final Answer:
Hi -> Option A
Quick Check:
Method greet returns "Hi" [OK]
Hint: Method returns string; puts prints it [OK]
Common Mistakes:
Expecting 'Hello' instead of 'Hi'
Thinking method is undefined
Confusing return value with nil
4. Identify the error in this code snippet:
MyClass = Class.new {
def greet
"Hello"
end
end
obj = MyClass.new
puts obj.greet
medium
A. Using curly braces instead of do-end for multi-line block
B. Missing parentheses in method definition
C. Cannot call new on Class.new result
D. Method greet should use puts instead of return
Solution
Step 1: Check block syntax for Class.new
Curly braces are for single-line blocks. Multi-line blocks should use do-end syntax.
Step 2: Confirm other parts are correct
Method definition syntax is valid, calling new is valid, and returning string is correct.
Final Answer:
Using curly braces instead of do-end for multi-line block -> Option A
Quick Check:
Multi-line block needs do-end [OK]
Hint: Use do-end for multi-line Class.new blocks [OK]
Common Mistakes:
Using curly braces for multi-line blocks
Thinking method needs parentheses
Confusing method return with puts
5. You want to create a dynamic class with Class.new that has an initializer accepting a name and a method greet returning "Hello, <name>". Which code correctly implements this?
hard
A. Person = Class.new {
def initialize(name)
@name = name
end
def greet
"Hello, " + name
end
}
B. Person = Class.new do
def initialize(name)
@name = name
end
def greet
"Hello, #{@name}"
end
end
C. Person = Class.new do
def initialize(name)
name = @name
end
def greet
"Hello, " + @name
end
end
D. Person = Class.new do
def initialize(name)
@name = name
end
def greet
puts "Hello, #{@name}"
end
end
Person = Class.new do
def initialize(name)
@name = name
end
def greet
"Hello, #{@name}"
end
end correctly assigns @name = name in initialize. Person = Class.new do
def initialize(name)
name = @name
end
def greet
"Hello, " + @name
end
end reverses assignment incorrectly. Person = Class.new {
def initialize(name)
@name = name
end
def greet
"Hello, " + name
end
} uses wrong block syntax. Person = Class.new do
def initialize(name)
@name = name
end
def greet
puts "Hello, #{@name}"
end
end uses puts in greet which prints but does not return the string.
Step 2: Check greet method returns correct string
Person = Class.new do
def initialize(name)
@name = name
end
def greet
"Hello, #{@name}"
end
end returns the string with interpolation. Person = Class.new {
def initialize(name)
@name = name
end
def greet
"Hello, " + name
end
} uses undefined variable name. Person = Class.new do
def initialize(name)
@name = name
end
def greet
puts "Hello, #{@name}"
end
end prints instead of returning.
Final Answer:
Person = Class.new do
def initialize(name)
@name = name
end
def greet
"Hello, #{@name}"
end
end -> Option B
Quick Check:
Correct initializer and return string in greet [OK]
Hint: Assign @name in initialize; return string in greet [OK]
Common Mistakes:
Reversing assignment in initialize
Using puts instead of returning string
Wrong block syntax with curly braces
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.