I’ve not found this stated clearly enough elsewhere so I’m doing so myself.
Ruby’s case statement calls the ===
method on the argument to each of the when statements
So, this example:
case my_number
when 6883
:prime
end
Will execute 6883 === my_number
This is all fine and dandy, because the ===
method on a Fixnum instance does what you’d expect in this scenario.
However, the ===
method on the Fixnum class does something different. It’s an alias of is_a?
That is cute, because it allows you to do this:
case my_number
when Fixnum
"Easy to memorize"
when Bignum
"Hard to memorize"
end
But it won’t work as you might expect in this scenario:
my_type = Fixnum
case my_type
when Fixnum
"Fixed number"
end
This won’t work because Fixnum === Fixnum
returns false
because the Fixnum
class is not an instance of Fixnum
.
My workaround for this is to convert it to a string first. Not sure if that’s the best solution, but it works for me(tm).
my_type = Fixnum
case my_type.to_s
when "Fixnum"
"Fixed number"
end