A class variable in Ruby is a variable shared among a class and all its subclasses. It is prefixed with @@ and holds data common to the class hierarchy.
Click to reveal answer
beginner
How do you declare a class variable in Ruby?
You declare a class variable by prefixing the variable name with @@ inside a class, for example: @@count = 0
Click to reveal answer
intermediate
Why can class variables (@@) be dangerous in Ruby?
Class variables are dangerous because they are shared across the entire class hierarchy, so changes in one subclass affect others unexpectedly, leading to bugs that are hard to track.
Click to reveal answer
intermediate
What is a safer alternative to class variables in Ruby?
Using class instance variables (e.g., @count inside class << self or self methods) is safer because they belong only to the specific class, not shared with subclasses.
Click to reveal answer
advanced
Explain with an example how class variables can cause unexpected behavior.
If a superclass and its subclass both modify @@var, the changes affect each other. For example, if superclass sets @@count = 1 and subclass sets @@count = 5, both see the last value 5, which can cause confusion.
Click to reveal answer
What symbol is used to declare a class variable in Ruby?
A@
B@@
C$
D#
✗ Incorrect
Class variables in Ruby always start with @@.
What is a main risk of using class variables (@@) in Ruby?
AThey are shared across subclasses, causing unexpected side effects.
BThey cannot be accessed inside instance methods.
CThey are slower than local variables.
DThey are private by default.
✗ Incorrect
Class variables are shared across the class hierarchy, so changes in one subclass affect others.
Which is a safer alternative to class variables for storing class-specific data?
AClass instance variables (@var)
BGlobal variables ($var)
CLocal variables (var)
DConstants (VAR)
✗ Incorrect
Class instance variables belong only to the class itself, not shared with subclasses.
If a superclass and subclass both modify @@var, what happens?
AAn error is raised.
BEach has its own separate @@var.
CThe subclass cannot access @@var.
DThey share the same @@var, so changes affect both.
✗ Incorrect
Class variables are shared across the class hierarchy, so both classes see the same variable.
How do you access a class instance variable inside a class method?
AUse $var inside the class method.
BUse @@var inside the class method.
CUse @var inside the class method.
DUse var without any prefix.
✗ Incorrect
Class instance variables use a single @ and can be accessed inside class methods.
Describe what class variables (@@) are in Ruby and why they can cause problems in inheritance.
Think about how one change affects all related classes.
You got /4 concepts.
Explain the difference between class variables (@@) and class instance variables (@) in Ruby.
Focus on scope and sharing of data.
You got /4 concepts.
Practice
(1/5)
1. What is a key characteristic of Ruby class variables (@@)?
easy
A. They are unique to each instance of a class.
B. They are shared among a class and all its subclasses.
C. They are only accessible inside instance methods.
D. They behave like local variables inside methods.
Solution
Step 1: Understand class variable scope
Class variables (@@) are shared across a class and all its subclasses, meaning they hold the same value for all related classes.
Step 2: Compare with other variable types
Instance variables are unique per object, local variables are method-specific, so they don't share data like class variables do.
Final Answer:
They are shared among a class and all its subclasses. -> Option B
Quick Check:
Class variables share data across class hierarchy [OK]
Hint: Remember @@ means shared across class and subclasses [OK]
Common Mistakes:
Confusing class variables with instance variables
Thinking @@ variables are local to instances
Assuming @@ variables are private to one class
2. Which of the following is the correct syntax to define and use a class variable in Ruby?
easy
A. class MyClass
@@count = 0
end
B. class MyClass
@count = 0
end
C. class MyClass
$count = 0
end
D. class MyClass
count = 0
end
Solution
Step 1: Identify class variable syntax
Class variables start with @@, so @@count = 0 is correct for defining a class variable.
Step 2: Differentiate other variable types
@count is an instance variable, $count is a global variable, and count alone is a local variable.
Final Answer:
class MyClass
@@count = 0
end -> Option A
Quick Check:
Class variable syntax uses @@ [OK]
Hint: Class variables always start with @@ [OK]
Common Mistakes:
Using @ instead of @@ for class variables
Confusing global variables ($) with class variables
Defining variables without any prefix
3. What will be the output of the following Ruby code?
class Parent
@@value = 1
def self.value
@@value
end
def self.value=(v)
@@value = v
end
end
class Child < Parent
end
Parent.value = 5
puts Child.value
medium
A. 5
B. Error
C. nil
D. 1
Solution
Step 1: Understand class variable sharing
The class variable @@value is shared between Parent and Child classes.
Step 2: Trace the assignment and output
Setting Parent.value = 5 changes @@value to 5 for both classes. So, Child.value returns 5.
Final Answer:
5 -> Option A
Quick Check:
Class variables shared, so Child.value = 5 [OK]
Hint: Class variables share values across subclasses [OK]
Common Mistakes:
Assuming Child has its own separate @@value
Expecting default value 1 after change
Confusing class variables with instance variables
4. Identify the problem in this Ruby code using class variables:
class A
@@count = 0
def initialize
@@count += 1
end
def self.count
@@count
end
end
class B < A
def initialize
@@count += 10
end
end
A.new
B.new
puts A.count
medium
A. The code has a syntax error in class B definition.
B. The class variable @@count is not initialized properly.
C. The class variable @@count is shared and modified differently causing unexpected count.
D. The method self.count is missing a return statement.
Solution
Step 1: Analyze class variable usage in inheritance
Both classes A and B share the same @@count. A#initialize adds 1, B#initialize adds 10.
Step 2: Understand the effect on count
Creating A.new adds 1, then B.new adds 10, so total @@count becomes 11, which may be unexpected if counting instances separately.
Final Answer:
The class variable @@count is shared and modified differently causing unexpected count. -> Option C
Quick Check:
Shared @@count causes tricky bugs [OK]
Hint: Shared @@ variables cause unexpected cross-class changes [OK]
Common Mistakes:
Thinking @@count is separate per class
Ignoring inheritance effect on @@ variables
Assuming initialize methods don't affect shared vars
5. You want to track the number of instances created separately for two subclasses without interference. Which approach avoids the dangers of class variables (@@)?
hard
A. Use a local variable inside the initialize method to count instances.
B. Use a global variable ($count) shared by all classes.
C. Use class variables (@@count) but reset them in each subclass initialize.
D. Use class instance variables (@count) in each subclass instead of @@count.
Solution
Step 1: Understand the problem with class variables
Class variables (@@count) are shared across subclasses, causing counts to mix and produce wrong totals.
Step 2: Use class instance variables for separate counts
Class instance variables (@count) belong to each class separately, so each subclass can track its own count safely.
Final Answer:
Use class instance variables (@count) in each subclass instead of @@count. -> Option D
Quick Check:
Class instance vars avoid shared @@ dangers [OK]
Hint: Use @count per class to avoid shared @@count bugs [OK]
Common Mistakes:
Using global variables which mix counts globally
Trying to reset @@count which is error-prone
Using local variables which don't persist counts
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.