Search code examples
rubyweak-typing

Does ruby 1.9.2 have an is_a? function?


I googled that there is an is_a? function to check whether an object is an integer or not.

But I tried in rails console, and it doesn't work.

I ran the code like the following:

 "1".is_a?
 1.is_a?

Did I miss something?


Solution

  • There's not a built in function to say if a string is effectively an integer, but you can easily make your own:

    class String
      def int
        Integer(self) rescue nil
      end
    end
    

    This works because the Kernel method Integer() throws an error if the string can't be converted to an integer, and the inline rescue nil turns that error into a nil.

    Integer("1") -> 1
    Integer("1x") -> nil
    Integer("x") -> nil
    

    and thus:

    "1".int -> 1 (which in boolean terms is `true`)
    "1x".int -> nil
    "x".int -> nil
    

    You could alter the function to return true in the true cases, instead of the integer itself, but if you're testing the string to see if it's an integer, chances are you want to use that integer for something! I very commonly do stuff like this:

    if i = str.int
      # do stuff with the integer i
    else
      # error handling for non-integer strings
    end
    

    Although if the assignment in a test position offends you, you can always do it like this:

    i = str.int
    if i
      # do stuff with the integer i
    else
      # error handling for non-integer strings
    end
    

    Either way, this method only does the conversion once, which if you have to do a lot of these, may be a significant speed advantage.

    [Changed function name from int? to int to avoid implying it should return just true/false.]