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.