Ruby Quick Tip: Regular Expressions in Case Statements

Did you know that you can use regular expressions in case statements in Ruby to check for a match? For instance, if I’m implementing some method_missing functionality and I want to check for bang or question methods, I might be tempted to do something like this:

def method_missing(name, *args)   name = name.to_s   if name.match(/!$/)     puts "Bang Method!"   elsif name.match(/?$/)     puts "Query Method?"   else     super   end end

But it’d be much cleaner if instead it looked like this:

def method_missing(name, *args)   case name.to_s     when /!$/       puts "Bang Method!"     when /?$/       puts "Query Method?"     else       super   end end

This is great, but now what if we want to call out a method for bang and question methods? Thankfully Ruby has us covered there as well:

def method_missing(name, *args)   case name.to_s     when /^(.*)!$/       bang_method($1)     when /^(.*)?$/       question_method($1)     else       super   end end

By using the $1 global variable we can access the last regular expression match performed by ruby. This is just one of those little details that makes working with Ruby such a joy.