What if you could ask questions in your code as simply as you ask a friend?
Why Predicate methods (ending with ?) in Ruby? - Purpose & Use Cases
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.
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.
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.
if user.logged_in == true puts 'Welcome!' end
if user.logged_in? puts 'Welcome!' end
It makes your code cleaner, easier to read, and less error-prone by clearly expressing yes/no questions.
When building a website, you can quickly check if a user is an admin by calling user.admin? instead of writing complex checks.
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
Solution
Step 1: Understand predicate method purpose
Predicate methods in Ruby are designed to answer yes/no questions about an object or data.Step 2: Identify return type of predicate methods
They always return true or false, which are boolean values.Final Answer:
A boolean value (true or false) -> Option BQuick Check:
Predicate methods return true/false [OK]
- Thinking predicate methods return strings or numbers
- Confusing predicate methods with regular methods
- Ignoring the question mark at the end
Solution
Step 1: Recognize predicate method naming
Predicate methods must end with a question mark (?).Step 2: Check method syntax
def valid?; true; end defines a method named valid? correctly with def and end keywords.Final Answer:
def valid?; true; end -> Option AQuick Check:
Method name ends with ? and syntax is correct [OK]
- Omitting the question mark in method name
- Using invalid method name characters like ! or :
- Incorrect method definition syntax
def empty_string?(str)
str.empty?
end
puts empty_string?("")
puts empty_string?("hello")Solution
Step 1: Understand the method behavior
The method empty_string? calls str.empty? which returns true if str is an empty string.Step 2: Evaluate the calls
empty_string?("") returns true because "" is empty; empty_string?("hello") returns false because "hello" is not empty.Final Answer:
true\nfalse -> Option CQuick Check:
Empty string check returns true, non-empty returns false [OK]
- Assuming non-empty strings return true
- Confusing empty? with nil? method
- Ignoring the question mark in method names
def positive?(num)
if num > 0
true
else
false
end
end
puts positive?("5")Solution
Step 1: Analyze method input and comparison
The method compares num > 0, but "5" is a string, not a number.Step 2: Understand Ruby type comparison
Comparing string "5" with integer 0 causes an ArgumentError at runtime.Final Answer:
ArgumentError because "5" is a string, not a number -> Option AQuick Check:
Comparing string and integer causes ArgumentError [OK]
- Passing strings instead of numbers
- Assuming no error on mixed type comparisons
- Missing end keyword (not the case here)
valid_name? that returns true only if a string is not empty and contains only letters. Which implementation is correct?Solution
Step 1: Understand the requirements
The method must return true only if the string is not empty and contains only letters.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.Final Answer:
def valid_name?(name) !name.empty? && name.match?(/^[a-zA-Z]+$/) end -> Option DQuick Check:
Not empty and only letters = valid_name? true [OK]
- Using || instead of && for conditions
- Checking for digits instead of letters
- Ignoring empty string check
Ready to prove it?
Pass the test and this pattern moves unknown
