Home > database >  Ruby. How is the case equality method implemented in the class Class?
Ruby. How is the case equality method implemented in the class Class?

Time:05-12

Is there any special Reason why the === and the == methods are implemented differently in the class Class?

"".class == String
#=> true

"".class === String
#=> false

CodePudding user response:

We can further simplify your question I think. I believe you are asking is why

String == String # true

But

String === String # false

I think it's semi consistent by Ruby. the === equality asks if right side is a member of the left side.

So

Class === String

Is true since String is a member of Class. And indeed String is not a member of String.

What I do find weird though is that

5 === 5 # returns true

Imo it should return false to be consistent with String === String returning false, but for primitives Ruby has this quirk, probably so it works well with case statements.

CodePudding user response:

The goal of === (called "case quality") is to be used within case statement. Creators decided that aliasing === with is_a? works best with a common scenarios like:

def do_sth(object)
  case object
    when :nothing then ...
    when String then ...
    when Hash then ...
    else ...
end

=== should (almost) never be explicitly used outside of the case statement.

  • Related