How do I implement a switch statement in Ruby?
In Ruby, you implement switch-like functionality using the case statement, which serves as Ruby’s equivalent to traditional switch statements found in other programming languages. The case statement provides clean, readable conditional branching with multiple cases and supports various comparison methods including ===, ==, and eql?.
Contents
- Basic Case Statement Syntax
- Advanced Case Features
- Case with Different Comparison Operators
- Case as Expression
- Common Use Cases and Examples
- Best Practices
Basic Case Statement Syntax
The fundamental structure of a Ruby case statement follows this pattern:
case expression
when condition1
# code to execute when condition1 matches
when condition2
# code to execute when condition2 matches
when condition3
# code to execute when condition3 matches
else
# code to execute when no conditions match
end
Here’s a practical example:
grade = 'B'
case grade
when 'A'
puts "Excellent!"
when 'B'
puts "Good job!"
when 'C'
puts "Average"
when 'D'
puts "Needs improvement"
else
puts "Invalid grade"
end
# Output: Good job!
The case statement in Ruby uses the === (case equality) operator for comparison, which provides more flexibility than simple equality checks.
Advanced Case Features
Multiple Conditions per When Clause
You can specify multiple conditions in a single when clause using commas:
day = "Saturday"
case day
when "Saturday", "Sunday"
puts "Weekend"
when "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"
puts "Weekday"
end
Range Matching
Ruby’s case statements naturally work with ranges:
age = 25
case age
when 0..12
puts "Child"
when 13..19
puts "Teenager"
when 20..64
puts "Adult"
else
puts "Senior"
end
Class and Type Checking
Case statements excel at type checking:
value = "hello"
case value
when String
puts "It's a string"
when Integer
puts "It's an integer"
when Array
puts "It's an array"
else
puts "Unknown type"
end
Case with Different Comparison Operators
Using the when Modifier
You can specify different comparison operators for each when clause:
x = 5
case x
when 3..7
puts "x is between 3 and 7"
when x > 10
puts "x is greater than 10"
else
puts "x is less than or equal to 10 but not in 3..7"
end
Using Procs in Case Statements
For more complex conditions, you can use procs:
case value
when ->(v) { v > 10 }
puts "Greater than 10"
when ->(v) { v < 0 }
puts "Negative number"
else
puts "Between 0 and 10"
end
Case as Expression
Like many Ruby constructs, the case statement can be used as an expression that returns a value:
result = case score
when 90..100
'A'
when 80..89
'B'
when 70..79
'C'
when 60..69
'D'
else
'F'
end
puts "Grade: #{result}"
You can also use the then keyword for single-line case expressions:
message = case day
when 'Monday' then 'Start of the week'
when 'Friday' then 'End of the week'
else 'Regular day'
end
Common Use Cases and Examples
Command-Line Argument Processing
require 'optparse'
options = {}
OptionParser.new do |opts|
opts.on('-v', '--verbose', 'Verbose output') { |v| options[:verbose] = v }
opts.on('-q', '--quiet', 'Quiet mode') { |q| options[:quiet] = q }
opts.on('-f', '--file FILENAME', 'Input file') { |f| options[:file] = f }
end.parse!
case
when options[:verbose]
puts "Verbose mode enabled"
when options[:quiet]
puts "Quiet mode enabled"
when options[:file]
puts "Processing file: #{options[:file]}"
else
puts "No options specified"
end
HTTP Status Code Handling
def handle_response(status_code)
case status_code
when 200
"Success"
when 201, 202
"Created or Accepted"
when 301, 302, 303
"Redirect"
when 400
"Bad Request"
when 401
"Unauthorized"
when 403
"Forbidden"
when 404
"Not Found"
when 500..599
"Server Error"
else
"Unknown status code"
end
end
State Machine Implementation
class TrafficLight
attr_accessor :state
def initialize
@state = 'red'
end
def change
case @state
when 'red'
@state = 'green'
when 'green'
@state = 'yellow'
when 'yellow'
@state = 'red'
end
end
end
Best Practices
1. Use Case Statements for Multiple Conditions
Prefer case statements over multiple if-elsif-else chains when you have more than two or three conditions:
# Good - clear and readable
case day
when 'Monday' then 'Start of week'
when 'Friday' then 'End of week'
else 'Regular day'
end
# Less readable for multiple conditions
if day == 'Monday'
'Start of week'
elsif day == 'Friday'
'End of week'
else
'Regular day'
end
2. Leverage Ruby’s Flexible Comparison
Take advantage of Ruby’s === operator capabilities:
# Range matching
case age
when 0..17 then "Minor"
when 18..64 then "Adult"
else "Senior"
end
# Type checking
case obj
when String then "It's a string"
when Integer then "It's an integer"
when Array then "It's an array"
end
3. Handle Edge Cases with else
Always include an else clause to handle unexpected values:
case input
when 'yes', 'y' then confirm_action
when 'no', 'n' then cancel_action
else raise "Invalid input: #{input}"
end
4. Consider Performance for Simple Equality
For simple equality checks with primitive types, consider if a hash might be more efficient:
# Case statement
case status
when 'active' then handle_active
when 'inactive' then handle_inactive
when 'pending' then handle_pending
end
# Hash lookup (can be faster for simple cases)
actions = {
'active' => -> { handle_active },
'inactive' => -> { handle_inactive },
'pending' => -> { handle_pending }
}
actions[status]&.call || handle_unknown
5. Use then for Single-Line Cases
For simple cases that fit on one line, use the then keyword:
case day
when 'Monday' then 'Start of week'
when 'Friday' then 'End of week'
when 'Saturday', 'Sunday' then 'Weekend'
else 'Regular day'
end
Ruby’s case statement is a powerful and flexible construct that serves as the language’s equivalent to traditional switch statements. Its ability to handle various comparison types, ranges, class checks, and multiple conditions makes it ideal for complex conditional logic while maintaining clean, readable code.
Conclusion
- Ruby uses the
casestatement as its equivalent to traditional switch statements found in other programming languages - The
casestatement supports flexible comparison using the===operator, allowing range matching, type checking, and multiple conditions - Case statements can be used as expressions that return values, making them versatile for both control flow and value assignment
- Best practices include using case statements for multiple conditions, leveraging Ruby’s flexible comparison capabilities, and always handling edge cases with
elseclauses - For simple equality checks with primitive types, consider whether a hash lookup might be more efficient than a case statement