1.day Ruby's case operator === behaved badly
By: Johnathon Wright on: May 29, 2009
This is a follow-up to a previous post about the Ruby case operator, ===.
I previously understood that, for a === b where a is a class, the result would be b.class.ancestors.include?(a)
when a is an instance, the result would be a == b
This proves true for many examples.
---ruby
3.class.ancestors.all? {|a| a === 3}
=> true
So I was very suprised to find this:
---ruby
3.days.class => Fixnum
Fixnum === 3.days => False
3.days.class.ancestors.include?(Fixnum)
=> true
---ruby def days ActiveSupport::Duration.new(self * 24.hours, [[:days, self]])
end
And, in fact: ---ruby
ActiveSupport::Duration === 3.days
=> true
I'm not clear on why this happens. I'll update this post as it becomes clear.