Unusual Case Statement Behavior
22 Jun 2023TIL something weird.
I expected this to print “Integer”, but it doesn’t:
mystery_class = Integer
case mystery_class
when Integer
p "Integer"
else
p "Unknown"
end
# => "Unknown"
This was weird because a similar example appears to behave differently:
mystery_instance = 0
case mystery_instance
when 0
p "Y"
else
p "N"
end
# => "Y"
Apparently this is because []case
uses ===
under the hood](https://stackoverflow.com/a/3908411) and ===
has kind of silly behavior when comparing classes.
For example:
Array === Array # false
0 === 0 # true
Class === Array # true
apparently case
also works different with ActiveRecord
classes, since they’ll use is_a?
instead which might also behave differently??? 😱
Anyway, if you want to use case
with classes for ActiveRecord
object you need to do this:
mystery_class = User.last
case mystery_class
when User
p "User"
else
p "Unknown"
end
# => "User"