In Ruby, what is the difference between == and ===? The RDoc says
Case Equality—For class Object,
effectively the same as calling #==,
but typically overridden by
descendents to provide meaningful
semantics in case statements.
Is #== the same as ==? And could you provide an example of when/how this is used in case statements?
The two really have nothing to do with each other. In particular,
#==is the equality operator and#===has absolutely nothing to with equality. Personally, I find it rather unfortunate that#===looks so similar to#==, uses the equals sign and is often called the case equality operator, triple equals operator or threequals operator when it really has nothing to do with equality.I call
#===the case subsumption operator (it’s the best I could come up with, I’m open to suggestions, especially from native English speakers).The best way to describe
a === bis “if I have a drawer labeleda, does it make sense to putbin it?”So, for example,
Module#===tests whetherb.is_a?(a). If you haveInteger === 2, does it make sense to put2in a box labeledInteger? Yes, it does. What aboutInteger === 'hello'? Obviously not.Another example is
Regexp#===. It tests for a match. Does it make sense to put'hello'in a box labeled/el+/? Yes, it does.For collections such as ranges,
Range#===is defined as a membership test: it makes sense to put an element in a box labeled with a collection if that element is in the collection.So, that’s what
#===does: it tests whether the argument can be subsumed under the receiver.What does that have to with
caseexpressions? Simple:is the same as