What exactly does obj.is_a? do?

I’ve got a theory that I hope someone familiar with the deep recesses of
Ruby’s internals can confirm or deny.

According to the API, obj.is_a? “Returns true if /class/ is the
class of /obj/, or if /class/ is one of the superclasses of /obj/ or
modules included in /obj/.”
For the purpose of this question, the only part I’m concerned with is
“Returns true if /class/ is the class of /obj/”, so let’s ignore the
rest.//

My theory is that Ruby is simply returning the result of…

@my_obj.class.object_id == Klass.object_id

when I do…

@my_obj.is_a?(Klass)

(Don’t forget we’re ignoring the superclass and module stuff it does).

Can anyone confirm or deny this?

I’d also appreciate a hint pointing me to where I could have dredged up
the answer to this one on my own. Thanks, and happy holidays!

Jon G. wrote:

@my_obj.class.object_id == Klass.object_id

when I do…

@my_obj.is_a?(Klass)

No: is_a? also returns true when the @my_obj is an instance of a
subclass of Klass.

(Don’t forget we’re ignoring the superclass and module stuff it does).

Can anyone confirm or deny this?

I’d also appreciate a hint pointing me to where I could have dredged up
the answer to this one on my own. Thanks, and happy holidays!

If you do

ri is_a?

on command-line, you’ll get immediate answer.

Vince

Vincent F. wrote:

No: is_a? also returns true when the @my_obj is an instance of a
subclass of Klass.

I realize that, but that’s beyond the scope of the issue I’m having.
That’s why my original post explicitly said to ignore the superclass and
module stuff it does (twice).

If you do

ri is_a?

on command-line, you’ll get immediate answer.

Nope, all I get is the exact same API stuff I’ve already looked at
before asking, and quoted in my original post.

To clarify, I’m interested in how, not if, is_a? determines whether
@my_obj.is_a?(Klass) with no concern for superclasses or modules. I’m
fairly confident it’s going to take somebody familiar with Ruby’s source
code, not just the API, to answer this one.