📖 Scenario: You are building a simple Ruby program to track books in a library. You want to add a feature that counts how many books have been created.
🎯 Goal: Create a module with a class method to count books. Then extend this module for class methods in the Book class.
📋 What You'll Learn
Create a module called BookCounter with a class method count that returns the number of books.
Create a class called Book.
Extend the BookCounter module for class methods in the Book class.
Create a class variable @@book_count in Book to track the number of books.
Increment @@book_count each time a new Book object is created.
Use the count class method to print the total number of books.
💡 Why This Matters
🌍 Real World
Counting objects like books, users, or orders is common in software to track totals or inventory.
💼 Career
Understanding how to add class methods via modules and track shared data is useful for Ruby developers building maintainable code.
Progress0 / 4 steps
1
Create the Book class with a class variable
Create a class called Book with a class variable @@book_count set to 0. Also, define an initialize method that increments @@book_count by 1 each time a new book is created.
Ruby
Hint
Use @@book_count to keep track of the number of books. Increment it inside initialize.
2
Create the BookCounter module with a class method
Create a module called BookCounter with a class method count that returns the value of @@book_count from the Book class.
Ruby
Hint
Use Book.class_variable_get(:@@book_count) inside the count method to access the class variable.
3
Extend BookCounter for class methods in Book
Extend the BookCounter module for class methods in the Book class using extend BookCounter.
Ruby
Hint
Use Book.extend BookCounter after the class and module definitions to add class methods to Book.
4
Create books and print the total count
Create three Book objects named book1, book2, and book3. Then print the total number of books using Book.count.
Ruby
Hint
Create three books with Book.new and print the count with puts Book.count.
Practice
(1/5)
1. What does the extend keyword do in Ruby when used inside a class?
easy
A. Includes the module's constants only
B. Adds the module's methods as instance methods to the class
C. Adds the module's methods as class methods to the class
D. Removes methods from the class
Solution
Step 1: Understand extend usage
The extend keyword adds methods from a module as class methods to the class that calls it.
Step 2: Differentiate from include
Unlike include, which adds methods as instance methods, extend adds them as class methods.
Final Answer:
Adds the module's methods as class methods to the class -> Option C
Quick Check:
extend = class methods [OK]
Hint: Remember: extend = class methods, include = instance methods [OK]
Common Mistakes:
Confusing extend with include
Thinking extend adds instance methods
Assuming extend removes methods
2. Which of the following is the correct syntax to add module methods as class methods using extend?
easy
A. class MyClass; def self.extend MyModule; end
B. class MyClass; include MyModule; end
C. class MyClass; MyModule.extend(self); end
D. class MyClass; extend MyModule; end
Solution
Step 1: Identify correct extend usage
The correct syntax is to call extend inside the class body with the module name.
Step 2: Check each option
class MyClass; extend MyModule; end uses extend MyModule inside the class, which is correct syntax.
Final Answer:
class MyClass; extend MyModule; end -> Option D
Quick Check:
Correct extend syntax = class MyClass; extend MyModule; end [OK]
Hint: Use 'extend ModuleName' inside class body for class methods [OK]
Common Mistakes:
Using include instead of extend
Calling extend on module instead of class
Incorrect method definition syntax
3. What will be the output of the following Ruby code?
module Greetings
def hello
"Hello from module"
end
end
class Person
extend Greetings
end
puts Person.hello
medium
A. NoMethodError: undefined method 'hello' for Person
B. Hello from module
C. Hello from module called on instance
D. SyntaxError
Solution
Step 1: Understand extend Greetings effect
The module's method hello becomes a class method of Person.
Step 2: Check method call
Person.hello calls the class method, which exists and returns "Hello from module".
Final Answer:
Hello from module -> Option B
Quick Check:
Class method from extend = "Hello from module" [OK]
Hint: extend adds module methods as class methods, so Person.hello works [OK]
Common Mistakes:
Thinking hello is an instance method
Calling hello on an instance instead of class
Expecting NoMethodError
4. Identify the error in this Ruby code snippet:
module Tools
def tool_name
"Hammer"
end
end
class Worker
extend Tools
def self.tool_name
"Wrench"
end
end
puts Worker.tool_name
medium
A. No error; output is 'Wrench'
B. NoMethodError because tool_name is undefined
C. SyntaxError due to extend usage
D. Output is 'Hammer' ignoring class method
Solution
Step 1: Analyze method definitions
The module Tools defines tool_name, which is added as a class method to Worker by extend Tools.
Step 2: Check method override
Worker defines its own class method tool_name, which overrides the module method.
Final Answer:
No error; output is 'Wrench' -> Option A
Quick Check:
Class method override works; output = 'Wrench' [OK]
Hint: Class methods override extended module methods if defined later [OK]
Common Mistakes:
Assuming module method overrides class method
Expecting NoMethodError
Confusing instance and class methods
5. You want to share a method info as a class method across multiple classes without repeating code. Which approach using extend is best?
module InfoModule
def info
"Shared class info"
end
end
class Alpha
# What to do here?
end
class Beta
# What to do here?
end
hard
A. Add extend InfoModule inside both Alpha and Beta classes
B. Add include InfoModule inside both Alpha and Beta classes
C. Define def self.info separately in Alpha and Beta
D. Use InfoModule.extend(self) outside classes
Solution
Step 1: Understand sharing class methods
Using extend InfoModule inside each class adds info as a class method.
Step 2: Evaluate options
Add extend InfoModule inside both Alpha and Beta classes correctly uses extend in both classes to share the method without repetition.
Final Answer:
Add extend InfoModule inside both Alpha and Beta classes -> Option A
Quick Check:
Use extend in each class to share class methods [OK]
Hint: Use extend inside each class to share class methods from a module [OK]
Common Mistakes:
Using include instead of extend for class methods
Defining methods separately instead of sharing
Calling extend on module instead of class
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.