Bird
Raised Fist0
Rubyprogramming~3 mins

Why Predicate methods (ending with ?) in Ruby? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if you could ask questions in your code as simply as you ask a friend?

The Scenario

Imagine you want to check if a user is logged in or if a number is even by writing long if-else statements everywhere in your code.

You have to write full checks like if user.logged_in == true or if number % 2 == 0 repeatedly.

The Problem

This manual way is slow and makes your code bulky and hard to read.

It's easy to make mistakes, like forgetting to compare properly or mixing up true/false values.

It also makes your code less clear about what you are really checking.

The Solution

Predicate methods ending with ? give you a simple, clear way to ask yes/no questions in your code.

They return true or false directly, so you can write user.logged_in? or number.even? and instantly understand the check.

Before vs After
✗ Before
if user.logged_in == true
  puts 'Welcome!'
end
✓ After
if user.logged_in?
  puts 'Welcome!'
end
What It Enables

It makes your code cleaner, easier to read, and less error-prone by clearly expressing yes/no questions.

Real Life Example

When building a website, you can quickly check if a user is an admin by calling user.admin? instead of writing complex checks.

Key Takeaways

Predicate methods end with ? and return true or false.

They simplify yes/no checks in your code.

Using them makes your code easier to read and less error-prone.

Practice

(1/5)
1. What does a predicate method in Ruby always return?
easy
A. A string value
B. A boolean value (true or false)
C. An integer value
D. An array

Solution

  1. Step 1: Understand predicate method purpose

    Predicate methods in Ruby are designed to answer yes/no questions about an object or data.
  2. Step 2: Identify return type of predicate methods

    They always return true or false, which are boolean values.
  3. Final Answer:

    A boolean value (true or false) -> Option B
  4. Quick Check:

    Predicate methods return true/false [OK]
Hint: Predicate methods always answer yes/no questions [OK]
Common Mistakes:
  • Thinking predicate methods return strings or numbers
  • Confusing predicate methods with regular methods
  • Ignoring the question mark at the end
2. Which of the following is the correct way to define a predicate method in Ruby?
easy
A. def valid?; true; end
B. def valid; true; end
C. def valid!; true; end
D. def valid: true; end

Solution

  1. Step 1: Recognize predicate method naming

    Predicate methods must end with a question mark (?).
  2. Step 2: Check method syntax

    def valid?; true; end defines a method named valid? correctly with def and end keywords.
  3. Final Answer:

    def valid?; true; end -> Option A
  4. Quick Check:

    Method name ends with ? and syntax is correct [OK]
Hint: Predicate methods end with ? and use def ... end [OK]
Common Mistakes:
  • Omitting the question mark in method name
  • Using invalid method name characters like ! or :
  • Incorrect method definition syntax
3. What will be the output of this Ruby code?
def empty_string?(str)
  str.empty?
end

puts empty_string?("")
puts empty_string?("hello")
medium
A. false\ntrue
B. true\ntrue
C. true\nfalse
D. false\nfalse

Solution

  1. Step 1: Understand the method behavior

    The method empty_string? calls str.empty? which returns true if str is an empty string.
  2. Step 2: Evaluate the calls

    empty_string?("") returns true because "" is empty; empty_string?("hello") returns false because "hello" is not empty.
  3. Final Answer:

    true\nfalse -> Option C
  4. Quick Check:

    Empty string check returns true, non-empty returns false [OK]
Hint: empty? returns true only for empty strings [OK]
Common Mistakes:
  • Assuming non-empty strings return true
  • Confusing empty? with nil? method
  • Ignoring the question mark in method names
4. Identify the error in this Ruby code:
def positive?(num)
  if num > 0
    true
  else
    false
  end
end

puts positive?("5")
medium
A. ArgumentError because "5" is a string, not a number
B. SyntaxError due to missing end
C. No error, outputs true
D. Returns nil instead of true/false

Solution

  1. Step 1: Analyze method input and comparison

    The method compares num > 0, but "5" is a string, not a number.
  2. Step 2: Understand Ruby type comparison

    Comparing string "5" with integer 0 causes an ArgumentError at runtime.
  3. Final Answer:

    ArgumentError because "5" is a string, not a number -> Option A
  4. Quick Check:

    Comparing string and integer causes ArgumentError [OK]
Hint: Check input types before numeric comparisons [OK]
Common Mistakes:
  • Passing strings instead of numbers
  • Assuming no error on mixed type comparisons
  • Missing end keyword (not the case here)
5. You want to create a predicate method valid_name? that returns true only if a string is not empty and contains only letters. Which implementation is correct?
hard
A. def valid_name?(name) name.nil? && name.match?(/[a-z]/) end
B. def valid_name?(name) name.empty? || name.match?(/\d+/) end
C. def valid_name?(name) name.length > 0 && name.include?(' ') end
D. def valid_name?(name) !name.empty? && name.match?(/^[a-zA-Z]+$/) end

Solution

  1. Step 1: Understand the requirements

    The method must return true only if the string is not empty and contains only letters.
  2. Step 2: Evaluate each option

    def valid_name?(name) !name.empty? && name.match?(/^[a-zA-Z]+$/) end checks that name is not empty and matches only letters using regex /^[a-zA-Z]+$/. This meets the requirements.
  3. Final Answer:

    def valid_name?(name) !name.empty? && name.match?(/^[a-zA-Z]+$/) end -> Option D
  4. Quick Check:

    Not empty and only letters = valid_name? true [OK]
Hint: Use regex and empty? to validate strings in predicates [OK]
Common Mistakes:
  • Using || instead of && for conditions
  • Checking for digits instead of letters
  • Ignoring empty string check
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