📖 Scenario: Imagine you are creating a simple system to track books in a library. Each book has a title and an author. You want to count how many books have been created in total, no matter which book it is.
🎯 Goal: You will build a Ruby class Book that keeps track of how many book objects have been created using class-level behavior.
📋 What You'll Learn
Create a class called Book
Add an instance method initialize that takes title and author parameters
Add a class variable @@count to count how many books have been created
Increment @@count each time a new Book is created
Add a class method self.count that returns the total number of books created
Create at least two Book objects with given titles and authors
Print the total number of books created using the class method
💡 Why This Matters
🌍 Real World
Counting objects like books, users, or orders is common in software to track totals or limits.
💼 Career
Understanding class-level behavior is important for designing classes that manage shared data or resources in Ruby applications.
Progress0 / 4 steps
1
Create the Book class with initialize method
Create a class called Book with an initialize method that takes title and author as parameters and sets them as instance variables.
Ruby
Hint
Use @title and @author to store the values inside the object.
2
Add a class variable to count books
Inside the Book class, add a class variable @@count and set it to 0 before the initialize method.
Ruby
Hint
Class variables start with @@ and are shared by all instances.
3
Increment count when a book is created
Inside the initialize method, add code to increase @@count by 1 each time a new Book object is created.
Ruby
Hint
Use @@count += 1 to add one to the class variable.
4
Add class method and print total books
Add a class method self.count inside the Book class that returns @@count. Then create two Book objects with titles '1984' and 'Brave New World' and authors 'George Orwell' and 'Aldous Huxley'. Finally, print the total number of books created by calling Book.count.
Ruby
Hint
Define def self.count to make a class method. Use puts Book.count to print the total.
Practice
(1/5)
1. What is the main reason to use class-level behavior in Ruby classes?
easy
A. To share data and methods among all instances of the class
B. To create unique data for each object
C. To make objects run faster
D. To avoid using instance variables
Solution
Step 1: Understand class-level behavior
Class-level behavior means data or methods shared by all objects of a class, not unique to each object.
Step 2: Identify the purpose
Sharing data and methods avoids repeating the same information in every object and keeps code clean.
Final Answer:
To share data and methods among all instances of the class -> Option A
Quick Check:
Class-level behavior = shared data/methods [OK]
Hint: Class-level means shared by all objects, not individual ones [OK]
Common Mistakes:
Confusing class-level with instance-level data
Thinking class-level makes objects faster
Believing class-level removes instance variables
2. Which of the following is the correct way to define a class method in Ruby?
easy
A. def class.method_name; end
B. def method_name; end
C. def @method_name; end
D. def self.method_name; end
Solution
Step 1: Recall class method syntax
In Ruby, class methods are defined with def self.method_name inside the class.
Step 2: Check options
def self.method_name; end uses def self.method_name, which is correct. def method_name; end defines an instance method. def @method_name; end uses invalid syntax. def class.method_name; end is incorrect syntax.
Final Answer:
def self.method_name; end -> Option D
Quick Check:
Class method syntax = def self.method_name [OK]
Hint: Class methods start with self. inside class [OK]
Common Mistakes:
Defining class methods without self.
Using @ for method names
Trying def class.method_name syntax
3. What will be the output of this Ruby code?
class Dog
@@count = 0
def initialize
@@count += 1
end
def self.count
@@count
end
end
Dog.new
Dog.new
puts Dog.count
medium
A. 2
B. 0
C. 1
D. Error
Solution
Step 1: Understand class variable usage
@@count is a class variable shared by all Dog instances. It starts at 0.
Step 2: Count increments on each new Dog
Each Dog.new calls initialize, which adds 1 to @@count. Two Dog.new calls increase @@count to 2.
Step 3: Output the class variable
Dog.count returns @@count, which is 2, so puts prints 2.
Final Answer:
2 -> Option A
Quick Check:
Class variable increments twice = 2 [OK]
Hint: Class variables track shared data across all instances [OK]
Common Mistakes:
Thinking @@count resets for each object
Confusing class variables with instance variables
Expecting an error from @@count usage
4. Identify the error in this Ruby class that tries to count instances:
class Cat
@@count = 0
def initialize
@count += 1
end
def self.count
@@count
end
end
Cat.new
Cat.new
puts Cat.count
medium
A. Missing def self.count method
B. Using @count instead of @@count in initialize
C. Class variable @@count not initialized
D. Syntax error in class definition
Solution
Step 1: Check variable usage in initialize
The code uses @count (an instance variable) instead of @@count (class variable) to increment count.
Step 2: Understand effect of mistake
Instance variable @count is nil initially, so @count += 1 causes an error or does not affect class count.
Step 3: Confirm other parts are correct
Class variable @@count is initialized and count method exists, so no other errors.
Final Answer:
Using @count instead of @@count in initialize -> Option B
Quick Check:
Increment class variable with @@count, not @count [OK]
Hint: Class variables start with @@, instance with @ [OK]
Common Mistakes:
Incrementing instance variable instead of class variable
Assuming @count affects all instances
Ignoring variable initialization errors
5. You want to track how many times a method is called across all instances of a class. Which approach correctly implements this in Ruby?
hard
A. Use a global variable $counter incremented inside the instance method
B. Use an instance variable @counter incremented inside the instance method
C. Use a class variable @@counter incremented inside the instance method
D. Use a local variable counter inside the method
Solution
Step 1: Understand the goal
We want to count method calls shared by all instances, so data must be shared at class level.
Step 2: Evaluate options
Class variable @@counter is shared by all instances, so incrementing it inside the instance method tracks total calls. Instance variable @counter is unique per object, local variable resets each call, global variable $counter works but is discouraged.
Step 3: Choose best practice
Using @@counter is the correct and clean way to track calls across all instances.
Final Answer:
Use a class variable @@counter incremented inside the instance method -> Option C
Quick Check:
Class variable tracks shared count [OK]
Hint: Use @@ for shared counters, not @ or local variables [OK]
Common Mistakes:
Using instance variables which count per object
Using local variables which reset each call
Using global variables which pollute global scope
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.