Case equality operator (or triple equals, ===
) in Ruby returns true if the passed class is in the ancestors list of the passed object's class:
1.class.ancestors # [Integer, Numeric, Object, ...]
Numeric === 1 # true
Object === 1 # true
So it can be used for determining object's class:
String === 'abc' # true
'abc'.class #=> String
In cases above the case equality operator works like #kind_of?
(or #is_a?
):
1.kind_of?(Integer) # true
1.is_a?(Numeric) # true
The classes above has different implementations of ===
operator, that's why the results of comparison are different:
String.===('abc') # the same as String === 'abc'
Also it means that order of the arguments is important:
1 === Integer # false
Top comments (1)
Be careful of accidentally using strict equality with
===
like so:That works with
==
but will fail with===
.===
is all types of fun in Ruby, especially forcase
statements and predicate methods likeany?
. It's even more fun when you realizeProc
uses===
forcall
. Taken one step further you can make your own classes which respond to===
to do fun things.