417
votes

I'll use python as an example of what I'm looking for (you can think of it as pseudocode if you don't know Python):

>>> a = 1
>>> type(a)
<type 'int'>

I know in ruby I can do :

1.9.3p194 :002 > 1.class
 => Fixnum 

But is this the proper way to determine the type of the object?

5
@JörgWMittag Yet AFAICR that's what ` type` does in Python, although my memory is fuzzy. You'd need isinstance or check for responds. But simply saying "NOES!!!" isn't really helpful, now, is it? Instead consider being educational.Dave Newton
@JörgWMittag While I'm sympathetic, OP provided code to mimic in Ruby. Unless you actually educate the OP saying noes isn't helpful, IMO. And even if you did, it would likely be informational only, since OP defined what s/he wanted thru code.Dave Newton
@JörgWMittag - in Ruby everything is an Object, so there's no primitive types as there are in Python (int, long, boolean etc.) As a result within Ruby, classes are type definitions. This is not limited to Ruby either, the word class and type are synonymous in several other languages, and more broadly in OOP theory.ocodo
Since we're really talking about Ruby here, Types and Classes are synonymous, there's no debate about this, all values are Objects. So for anyone simply talking about Ruby, Classes are Types. - ref: ruby-lang.org/en/aboutocodo
@JörgWMittag That essay is quite informative so far, and I'll read the rest of it when I get a chance. In particular, Cook seems to articulate quite well (and with much more background knowledge than I have) why it's incorrect to claim (as one of my professors did) that Python, Ruby, and other dynamically-typed languages "aren't really object-oriented" (what he probably meant, without realizing it, was that they weren't ADT-oriented). But Ruby isn't statically typed, so it doesn't have ADTs in the sense Cook is describing, so your objections on the basis of that distinction aren't helpful.Kyle Strand

5 Answers

677
votes

The proper way to determine the "type" of an object, which is a wobbly term in the Ruby world, is to call object.class.

Since classes can inherit from other classes, if you want to determine if an object is "of a particular type" you might call object.is_a?(ClassName) to see if object is of type ClassName or derived from it.

Normally type checking is not done in Ruby, but instead objects are assessed based on their ability to respond to particular methods, commonly called "Duck typing". In other words, if it responds to the methods you want, there's no reason to be particular about the type.

For example, object.is_a?(String) is too rigid since another class might implement methods that convert it into a string, or make it behave identically to how String behaves. object.respond_to?(:to_s) would be a better way to test that the object in question does what you want.

89
votes

you could also try: instance_of?

p 1.instance_of? Fixnum    #=> True
p "1".instance_of? String  #=> True
p [1,2].instance_of? Array #=> True
49
votes

Oftentimes in Ruby, you don't actually care what the object's class is, per se, you just care that it responds to a certain method. This is known as Duck Typing and you'll see it in all sorts of Ruby codebases.

So in many (if not most) cases, its best to use Duck Typing using #respond_to?(method):

object.respond_to?(:to_i)
26
votes

I would say "Yes". As "Matz" had said something like this in one of his talks, "Ruby objects have no types." Not all of it but the part that he is trying to get across to us. Why would anyone have said "Everything is an Object" then? To add he said "Data has Types not objects".

So we might enjoy this.

https://www.youtube.com/watch?v=1l3U1X3z0CE

But Ruby doesn't care to much about the type of object just the class. We use classes not types. All data then has a class.

12345.class

'my string'.class

They may also have ancestors

Object.ancestors

They also have meta classes but I'll save you the details on that.

Once you know the class then you'll be able to lookup what methods you may use for it. That's where the "data type" is needed. If you really want to get into details the look up...

"The Ruby Object Model"

This is the term used for how Ruby handles objects. It's all internal so you don't really see much of this but it's nice to know. But that's another topic.

Yes! The class is the data type. Objects have classes and data has types. So if you know about data bases then you know there are only a finite set of types.

text blocks numbers

0
votes

variable_name.class

Here variable name is "a" a.class