Why is the first statement false when the second is true? I understand
case uses === to compare the objects? Perhaps it switches them round as
in the last statement?
Why is the first statement false when the second is true? I understand
case uses === to compare the objects? Perhaps it switches them round as
in the last statement?
Yes; === is called on the when expression(s), with the case object as
argument.
case {}
when Hash then true
when Hash.send(:===, {}) then true
end
=> true
Hash === {}
=> true
Why is the first statement false when the second is true? I understand
case uses === to compare the objects? Perhaps it switches them round as
in the last statement?
No the LHS is the receiver and the RHS is the first argument of the
message.
{}.send(:===, Hash) the === instance_method of Hash is called which is
inherited from Object and basically means equality, hence false.
Hash.send(:===, {}) the class method of Hash is called which is
inherited from Class and means is_a? hence true.
Yes; === is called on the when expression(s), with the case object as
argument.
Well you are right of course, I said now because I did not understand
what OP meant
Some may say it’s an unexpected behaviour. Others will find
themselves detecting it as a welcome surprise. This is Ruby
at its best.
Yes; === is called on the when expression(s), with the case object as
argument.
Well you are right of course, I said now because I did not understand
what OP meant
at its best.
I always thought it was just the logical way to do the case statement.
Since you’re testing something about the case object, you may not know
what it is or what its === method does:
case x # what is x?
when 1 …
when “yes” …
when C
when nil …
end
So I don’t think it would make sense to have a case construct where
=== was called on x.
what OP meant
when 1 …
when “yes” …
when C
when nil …
end
So I don’t think it would make sense to have a case construct where
=== was called on x.
Another reason why that would be an odd way to do it: all tests then
would have to be implemented in x’s class - now how much sense would
that make to do that? Just think of the type test (i.e. using class
objects in when clause)…
Kind regards
robert
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.