We use find or detect to quickly get the first item in a list that matches what we want. It saves time by stopping as soon as it finds a match.
Find/detect for first match in Ruby
collection.find { |item| condition }
# or
collection.detect { |item| condition }Both find and detect do the same thing in Ruby.
The block inside { } tells Ruby what condition to check for each item.
numbers = [1, 3, 5, 8, 10] even = numbers.find { |n| n.even? } puts even
words = ['apple', 'banana', 'cherry'] word_with_a = words.detect { |w| w.include?('a') } puts word_with_a
This program looks through a list of people and finds the first one who is 18 or older. Then it prints that person's name.
people = [
{ name: 'Alice', age: 17 },
{ name: 'Bob', age: 20 },
{ name: 'Carol', age: 15 }
]
adult = people.find { |person| person[:age] >= 18 }
puts "First adult: #{adult[:name]}"If no item matches, find returns nil.
You can use find with arrays, hashes, or any collection that supports iteration.
find and detect help you get the first matching item from a list.
They stop searching as soon as they find a match, making your code faster.
Use a block to tell Ruby what to look for in each item.
Practice
What does the Ruby method find (also known as detect) do when called on an array?
Solution
Step 1: Understand the purpose of
Thefindfindmethod searches through the array elements one by one.Step 2: Identify what
It returns the first element for which the block condition is true, then stops searching.findreturnsFinal Answer:
It returns the first element that matches the condition in the block. -> Option CQuick Check:
find= first matching element [OK]
- Thinking find returns all matches
- Confusing find with methods that modify the array
- Assuming find sorts the array
Which of the following is the correct syntax to find the first even number in an array nums using find?
nums = [1, 3, 4, 6]
Solution
Step 1: Recall the block syntax for
The block must be passed with curly braces or do-end and use a block variable with pipes.findStep 2: Check each option's syntax
nums.find { |n| n.even? } uses correct block syntax:{ |n| n.even? }. Others have syntax errors.Final Answer:
nums.find { |n| n.even? } -> Option AQuick Check:
Correct block syntax = nums.find { |n| n.even? } [OK]
- Missing pipes around block variable
- Passing condition without a block
- Using wrong arrow or syntax for block
What is the output of the following Ruby code?
words = ["apple", "banana", "cherry", "date"]
result = words.find { |w| w.length > 5 }
puts resultSolution
Step 1: Check each word's length
"apple" (5), "banana" (6), "cherry" (6), "date" (4).Step 2: Find first word with length > 5
"banana" is the first word longer than 5 characters.Final Answer:
"banana" -> Option DQuick Check:
First word with length > 5 = "banana" [OK]
- Choosing the last matching word instead of first
- Confusing length condition
- Assuming find returns all matches
Identify the error in this Ruby code that tries to find the first negative number:
numbers = [3, 5, -2, 7] result = numbers.find do |n| n < 0 end puts result
Solution
Step 1: Check block syntax
Thedo...endblock with variablenis valid syntax forfind.Step 2: Confirm method usage
findaccepts a block and returns the first element matchingn < 0.Final Answer:
There is no error; the code works correctly. -> Option AQuick Check:
Valid block syntax and method usage = There is no error; the code works correctly. [OK]
- Thinking only curly braces work for blocks
- Assuming variable must be declared outside block
- Believing find can't take blocks
You have an array of hashes representing people:
people = [
{name: "Alice", age: 18},
{name: "Bob", age: 17},
{name: "Carol", age: 22}
]Which code finds the first person who is an adult (age 18 or older) and returns their name?
Solution
Step 1: Understand the condition for adult
Adult means age 18 or older, so condition isp[:age] >= 18.Step 2: Find first matching person and get name
Usefindordetectwith condition, then access[:name].Step 3: Check options carefully
people.find { |p| p[:age] >= 18 }[:name] uses correct condition and returns name. people.detect { |p| p[:age] >= 18 }[:age] returns age, not name. Options A and C use > 18, excluding age 18.Final Answer:
people.find { |p| p[:age] >= 18 }[:name] -> Option BQuick Check:
Correct condition and return name = people.find { |p| p[:age] >= 18 }[:name] [OK]
- Using > 18 excludes age 18
- Returning age instead of name
- Confusing find and detect (both work but check return)
Ready to prove it?
Pass the test and this pattern moves unknown
