Reputation: 24806
Is there anything more idiomatic than the following?
foo.class == String
Upvotes: 166
Views: 176821
Reputation: 80065
In addition to the other answers, Class
defines the method ===
to test whether an object is an instance of that class.
o.class
class of o
.o.instance_of? c
determines whether o.class == c
c === o
for a class or module, determine if o.is_a? c
(String === "s"
returns true
)o.is_a? c
Is o
an instance of c
or any of it's subclasses?o.kind_of? c
synonym for is_a?
Upvotes: 5
Reputation: 5097
You can do:
foo.instance_of?(String)
And the more general:
foo.kind_of?(String)
Upvotes: 35
Reputation: 383
I think a better way is to create some predicate methods. This will also save your "Single Point of Control".
class Object
def is_string?
false
end
end
class String
def is_string?
true
end
end
print "test".is_string? #=> true
print 1.is_string? #=> false
The more duck typing way ;)
Upvotes: -1
Reputation: 81510
A more duck-typing approach would be to say
foo.respond_to?(:to_str)
to_str
indicates that an object's class may not be an actual descendant of the String, but the object itself is very much string-like (stringy?).
Upvotes: 33
Reputation: 31077
I think you are looking for instance_of?
. is_a?
and kind_of?
will return true for instances from derived classes.
class X < String
end
foo = X.new
foo.is_a? String # true
foo.kind_of? String # true
foo.instance_of? String # false
foo.instance_of? X # true
Upvotes: 260
Reputation: 13332
foo.instance_of? String
or
foo.kind_of? String
if you you only care if it is derrived from String
somewhere up its inheritance chain
Upvotes: 8