Using case with ranges and patterns helps you check where a value fits in a group or matches a shape. It makes your code cleaner and easier to read.
Case with ranges and patterns in Ruby
case variable in pattern1 # code for pattern1 in pattern2 # code for pattern2 else # code if no pattern matches end
Use in to match patterns or ranges inside a case statement.
Ranges use start..end and match if the variable is inside that range.
case score in 0..59 puts "Fail" in 60..79 puts "Pass" in 80..100 puts "Excellent" else puts "Invalid score" end
data if it is an array with two elements or a hash with keys name and age.case data in [x, y] puts "Array with two elements: #{x} and #{y}" in {name: name, age: age} puts "Hash with name #{name} and age #{age}" else puts "Unknown format" end
This program defines a method that uses case with ranges and patterns to describe the input value. It shows how different inputs match different cases.
def describe_value(value) case value in 1..10 "Value is between 1 and 10" in 11..20 "Value is between 11 and 20" in [a, b] "Value is an array with two elements: #{a} and #{b}" in {name: name, age: age} "Value is a hash with name #{name} and age #{age}" else "Value does not match any pattern" end end puts describe_value(7) puts describe_value(15) puts describe_value([3, 4]) puts describe_value({name: "Alice", age: 30}) puts describe_value("hello")
Patterns can match arrays, hashes, and ranges to check the shape or value group.
If no pattern matches, the else block runs.
Pattern matching with case was added in Ruby 2.7 and improved in Ruby 3.x.
Case with ranges and patterns lets you check if a value fits in a range or matches a shape.
Use in inside case to match ranges like 1..10 or patterns like arrays and hashes.
This makes your code easier to read and reduces many if-elsif checks.
Practice
What does the in keyword do inside a case statement in Ruby when used with ranges?
Solution
Step 1: Understand the role of
Theinincaseinkeyword is used to match a value against a pattern or range inside acasestatement.Step 2: Check how it works with ranges
When used with a range like1..10, it checks if the value lies within that range.Final Answer:
It checks if the value falls within the given range. -> Option AQuick Check:
inwith range means value in range [OK]
in checks membership in range or pattern [OK]- Thinking
inassigns values instead of matching - Confusing range equality with membership
- Assuming
increates new objects
Which of the following is the correct syntax to match a number n in the range 5 to 15 inside a case statement using pattern matching?
case n
in ???
puts "In range"
else
puts "Out of range"
endSolution
Step 1: Identify correct pattern syntax in
Insideinclausecase,inis followed directly by the pattern, soin 5..15is correct syntax.Step 2: Check other options for syntax errors
Options withoutinor with extra parentheses are invalid syntax in this context.Final Answer:
in 5..15 -> Option DQuick Check:
Useinfollowed by the pattern without extra keywords or parentheses [OK]
in once, then the pattern without extra keywords [OK]- Writing
in in 5..15which is invalid - Adding parentheses around the range
- Using three-dot range
5...15which excludes 15
What will be the output of this Ruby code?
score = 75 case score in 0..49 then puts "Fail" in 50..79 then puts "Pass" in 80..100 then puts "Excellent" else puts "Invalid" end
Solution
Step 1: Check which range includes 75
75 is not in 0..49 but is in 50..79.Step 2: Match the corresponding output
The code prints "Pass" when score is in 50..79.Final Answer:
Pass -> Option AQuick Check:
75 in 50..79 means output "Pass" [OK]
- Choosing "Fail" because 75 is greater than 49
- Confusing inclusive and exclusive ranges
- Ignoring the order of case branches
Identify the error in this Ruby code snippet using case with pattern matching:
value = 10 case value in 1..5 puts "Low" in 6..10 puts "Medium" else puts "High" end
Solution
Step 1: Check syntax of
Usingcasewithinand rangesinwith ranges insidecaseis valid Ruby syntax.Step 2: Verify output for value 10
10 matches the range 6..10, so it prints "Medium".Final Answer:
No error; code runs and prints "Medium" -> Option BQuick Check:
inwith ranges works fine [OK]
in works like when for pattern matching [OK]- Thinking
thenis mandatory afterin - Confusing
inwithwhen - Trying to write ranges as arrays
Given this Ruby code, what will be the output?
data = [3, 7, 12, 18] case data in [Integer, Integer, Integer, Integer] puts "All integers" in [Integer, Integer, Integer, 18] puts "Last is 18" else puts "No match" end
Solution
Step 1: Understand array pattern matching order
Thecasechecks patterns in order. The first pattern matches any array of four integers.Step 2: Check if
Data is [3,7,12,18], all integers, so it matches the first pattern.datamatches first patternStep 3: Confirm second pattern is not reached
Since first pattern matches, second is skipped.Final Answer:
All integers -> Option CQuick Check:
First matching pattern runs, so output is "All integers" [OK]
- Assuming second pattern runs despite first matching
- Confusing element types with values in patterns
- Expecting syntax error due to pattern complexity
Ready to prove it?
Pass the test and this pattern moves unknown
