Check whether a variable is a string in Ruby

RubyIdiomsTypechecking

Ruby Problem Overview


Is there anything more idiomatic than the following?

foo.class == String

Ruby Solutions


Solution 1 - Ruby

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

Solution 2 - Ruby

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?).

Solution 3 - Ruby

You can do:

foo.instance_of?(String)

And the more general:

foo.kind_of?(String)

Solution 4 - Ruby

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

Solution 5 - Ruby

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
  • o.is_a? c Is o an instance of c or any of it's subclasses?
  • o.kind_of? c synonym for is_a?
  • c === o for a class or module, determine if o.is_a? c (String === "s" returns true)

Solution 6 - Ruby

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 ;)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondavidchambersView Question on Stackoverflow
Solution 1 - RubyCandideView Answer on Stackoverflow
Solution 2 - RubyAndrew GrimmView Answer on Stackoverflow
Solution 3 - RubyFederico BuilesView Answer on Stackoverflow
Solution 4 - RubyMatthewView Answer on Stackoverflow
Solution 5 - RubysteenslagView Answer on Stackoverflow
Solution 6 - Rubyschlegel11View Answer on Stackoverflow