What is the purpose of the Comparable module in Ruby?
The Comparable module allows objects to be compared using operators like <, <=, ==, >, and >= by defining a single <=> method.
Click to reveal answer
beginner
Which method must be defined in a class to use the Comparable module?
You must define the <=> method (called the spaceship operator) that returns -1, 0, or 1 depending on whether the object is less than, equal to, or greater than another object.
Click to reveal answer
intermediate
How does the <=> method work in the Comparable module?
It compares two objects and returns -1 if the first is less, 0 if equal, and 1 if greater. This single method enables all comparison operators.
Click to reveal answer
intermediate
Example: How to include Comparable in a class and define <code><=></code>?
class Box
include Comparable
attr_reader :volume
def initialize(volume)
@volume = volume
end
def <=>(other)
volume <=> other.volume
end
end
This lets you compare Box objects by volume.
Click to reveal answer
advanced
What happens if you include Comparable but do not define <=>?
Ruby will raise a NoMethodError when you try to compare objects because Comparable depends on the <=> method to work.
Click to reveal answer
What does the <=> method return when the first object is greater than the second?
A1
B-1
C0
Dtrue
✗ Incorrect
The <=> method returns 1 if the first object is greater than the second.
Which module do you include to get comparison operators by defining only <=>?
AEnumerable
BComparable
CKernel
DMath
✗ Incorrect
The Comparable module provides comparison operators when you define the <=> method.
If you want to compare objects by their age attribute, what should <=> return?
Aage + other.age
Bage == other.age
Cage <=> other.age
Dage > other.age
✗ Incorrect
The <=> method should return the result of comparing the age attributes using <=>.
What error occurs if Comparable is included but <=> is missing?
ASyntaxError
BArgumentError
CTypeError
DNoMethodError
✗ Incorrect
Ruby raises a NoMethodError because Comparable requires the <=> method.
Which of these operators is NOT provided by including Comparable?
A===
B==
C!=
D<
✗ Incorrect
The === operator is not provided by Comparable; it is used for case equality and pattern matching.
Explain how to use the Comparable module in a Ruby class to enable object comparisons.
Think about what method Comparable needs and what it returns.
You got /4 concepts.
Describe what the spaceship operator (<=>) does and why it is important for Comparable.
It's the heart of how Comparable works.
You got /4 concepts.
Practice
(1/5)
1.
What is the main purpose of including the Comparable module in a Ruby class?
easy
A. To allow the class to inherit from another class
B. To automatically generate getter and setter methods
C. To enable comparison operators like <, <=, ==, >, >= for objects of that class
D. To add string manipulation methods to the class
Solution
Step 1: Understand Comparable module purpose
The Comparable module provides comparison operators such as <, <=, ==, >, >= for objects.
Step 2: Recognize what including Comparable does
Including Comparable requires defining the <=> method and then gives the class comparison operators automatically.
Final Answer:
To enable comparison operators like <, <=, ==, >, >= for objects of that class -> Option C
Quick Check:
Comparable adds comparison operators = A [OK]
Hint: Comparable adds comparison operators if <=> is defined [OK]
Common Mistakes:
Thinking Comparable adds getters/setters
Confusing Comparable with inheritance
Assuming Comparable adds unrelated methods
2.
Which of the following is the correct way to define the comparison method <=> inside a Ruby class to use with Comparable?
class Box
include Comparable
def initialize(volume)
@volume = volume
end
def <=>(other)
?
end
end
easy
A. @volume <=> other.instance_variable_get(:@volume)
B. self.volume <=> other.volume
C. @volume <=> other.volume
D. @volume <=> other.@volume
Solution
Step 1: Understand instance variable access
The instance variable @volume is private, so to compare, we must access it properly.
Step 2: Check each option for syntax and correctness
self.volume <=> other.volume uses self.volume but no getter method is defined, so it fails. @volume <=> other.volume tries other.volume but no method exists. @volume <=> other.instance_variable_get(:@volume) uses other.instance_variable_get(:@volume), which accesses the variable correctly. @volume <=> other.@volume uses invalid syntax other.@volume.
Final Answer:
@volume <=> other.instance_variable_get(:@volume) -> Option A
Quick Check:
Access private var with instance_variable_get = B [OK]
Hint: Use instance_variable_get to access private vars in <=> [OK]
Common Mistakes:
Trying to access other.@volume directly (syntax error)
Assuming getter methods exist without defining them
Using self.volume without a method
3.
What will be the output of the following Ruby code?
class Person
include Comparable
attr_reader :age
def initialize(age)
@age = age
end
def <=>(other)
age <=> other.age
end
end
p1 = Person.new(30)
p2 = Person.new(25)
puts p1 > p2
medium
A. false
B. true
C. nil
D. Error
Solution
Step 1: Understand the <=> method
The <=> method compares the ages of two Person objects using age <=> other.age.
Step 2: Compare p1 and p2 using >
p1.age is 30, p2.age is 25, so 30 > 25 is true.
Final Answer:
true -> Option B
Quick Check:
30 > 25 = true [OK]
Hint: Compare attributes inside <=> for correct operator results [OK]
Common Mistakes:
Forgetting to include Comparable
Not defining <=> method
Confusing attribute names
4.
Identify the error in this Ruby class using Comparable and how to fix it:
class Item
include Comparable
def initialize(weight)
@weight = weight
end
def <=>(other)
@weight - other.weight
end
end
medium
A. Method <=> returns a number, should return -1, 0, or 1
B. Syntax error in method definition spacing
C. Missing include Comparable line
D. Cannot call other.weight because no weight method is defined
Solution
Step 1: Check method calls inside <=>
The code calls other.weight, but no weight method is defined in the class.
Step 2: Fix by adding an attr_reader for weight
Adding attr_reader :weight allows other.weight to work correctly.
Final Answer:
Cannot call other.weight because no weight method is defined -> Option D
Quick Check:
Missing getter method = D [OK]
Hint: Define attr_reader for accessed attributes in <=> [OK]
Common Mistakes:
Assuming instance variables are accessible without getters
Returning subtraction result instead of using <=> operator
Ignoring spacing in method definition (which is valid)
5.
You want to sort an array of Product objects by their price using Comparable. Which of the following is the best way to implement the <=> method?
class Product
include Comparable
attr_reader :price
def initialize(price)
@price = price
end
def <=>(other)
?
end
end
hard
A. price <=> other.price
B. other.price <=> price
C. price - other.price
D. price > other.price ? 1 : -1
Solution
Step 1: Understand the <=> method contract
The <=> method should return -1, 0, or 1 depending on comparison.
Step 2: Choose the correct comparison expression
Using price <=> other.price correctly returns -1, 0, or 1. other.price <=> price reverses order, sorting descending. price - other.price returns a number but not guaranteed -1,0,1. price > other.price ? 1 : -1 returns only 1 or -1, missing 0 case.
Final Answer:
price <=> other.price -> Option A
Quick Check:
Use <=> operator for proper comparison = C [OK]
Hint: Use <=> operator directly for clean comparison [OK]
Common Mistakes:
Reversing comparison order unintentionally
Returning subtraction result instead of <=>
Using ternary without zero equality case
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.