Bird
Raised Fist0
Rubyprogramming~5 mins

Comparable module usage in Ruby - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
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
Which module do you include to get comparison operators by defining only <=>?
AEnumerable
BComparable
CKernel
DMath
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
What error occurs if Comparable is included but <=> is missing?
ASyntaxError
BArgumentError
CTypeError
DNoMethodError
Which of these operators is NOT provided by including Comparable?
A===
B==
C!=
D<
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

      1. Step 1: Understand Comparable module purpose

        The Comparable module provides comparison operators such as <, <=, ==, >, >= for objects.
      2. Step 2: Recognize what including Comparable does

        Including Comparable requires defining the <=> method and then gives the class comparison operators automatically.
      3. Final Answer:

        To enable comparison operators like <, <=, ==, >, >= for objects of that class -> Option C
      4. 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

      1. Step 1: Understand instance variable access

        The instance variable @volume is private, so to compare, we must access it properly.
      2. 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.
      3. Final Answer:

        @volume <=> other.instance_variable_get(:@volume) -> Option A
      4. 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

      1. Step 1: Understand the <=> method

        The <=> method compares the ages of two Person objects using age <=> other.age.
      2. Step 2: Compare p1 and p2 using >

        p1.age is 30, p2.age is 25, so 30 > 25 is true.
      3. Final Answer:

        true -> Option B
      4. 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

      1. Step 1: Check method calls inside <=>

        The code calls other.weight, but no weight method is defined in the class.
      2. Step 2: Fix by adding an attr_reader for weight

        Adding attr_reader :weight allows other.weight to work correctly.
      3. Final Answer:

        Cannot call other.weight because no weight method is defined -> Option D
      4. 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

      1. Step 1: Understand the <=> method contract

        The <=> method should return -1, 0, or 1 depending on comparison.
      2. 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.
      3. Final Answer:

        price <=> other.price -> Option A
      4. 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 unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard