Ruby pattern matching uses case ... in to compare a value against patterns.

case in `case ... in` checks patterns from top to bottom and runs the first matching branch.

Case In Basics

status
case_in_basics.rb
Replay: real traced execution (multi-file project)
status = "ready"

case status
in "ready"
  message = "system ready"
in "error"
  message = "needs attention"
else
  message = "unknown status"
end

puts "status=#{status}"
puts "message=#{message}"
status = "error"

case status
in "ready"
  message = "system ready"
in "error"
  message = "needs attention"
else
  message = "unknown status"
end

puts "status=#{status}"
puts "message=#{message}"
status = "other"

case status
in "ready"
  message = "system ready"
in "error"
  message = "needs attention"
else
  message = "unknown status"
end

puts "status=#{status}"
puts "message=#{message}"
  1. status ← ready

    1status→ ready = "ready"  #@status="error", "other"23case status4in "ready"5  message = "system ready"6in "error"7  message = "needs attention"8else9  message = "unknown status"10end1112puts "status=#{statusready}"13puts "message=#{messagesystem ready}"
    outputstatus=ready
    message=system ready
  1. status ← error

    1status→ error = "error"23case status4in "ready"5  message = "system ready"6in "error"7  message = "needs attention"8else9  message = "unknown status"10end1112puts "status=#{statuserror}"13puts "message=#{messageneeds attention}"
    outputstatus=error
    message=needs attention
  1. status ← other

    1status→ other = "other"
  2. case status in

    3case statusother4in "ready"5  message = "system ready"
  3. message ← unknown status

    7  message = "needs attention"8else9  message→ unknown status = "unknown status"10end
  4. puts "status=#{status}"

    12puts "status=#{statusother}"13puts "message=#{messageunknown status}"
    outputstatus=other
    message=unknown status