Pranav
Pranav

Reputation: 143

Good explanation of ruby object model -- mainly, 'classes are objects'?

I am studying the ruby object model and have some questions. I understand the idea that an object only stores instance variables, and methods are stored in the class, which an object has a reference to. I also understand the idea of 'self' -- what it is, how it changes, etc.

However, what I don't understand is the notion that 'classes are objects.' Is there a good, intuitive explanation anywhere?

(BTW: I'm using Ruby Object Model and Metaprogramming and Metaprogramming Ruby as my two resources. If anybody can suggest something else, that would be helpful.)

Thanks.

Upvotes: 14

Views: 4552

Answers (6)

radarbob
radarbob

Reputation: 5101

what I don't understand is the notion that 'classes are objects.' Is there a good, intuitive explanation anywhere?

An answer to SO thread `Visual representation of Ruby Object Model' links to an excellent video on the subject.

Upvotes: 0

Michael Kohl
Michael Kohl

Reputation: 66837

Look at this article, you may find it helpful:

The Ruby Object Model - Structure and Semantics

Personally I learned a lot about the Ruby object model by reading about the Smalltalk one (e.g. in the Squeak documentation). And depending on how fluent you are in C, the MRI sources are quite approachable and yield the most definite answers.

Upvotes: 1

OscarRyz
OscarRyz

Reputation: 199264

The notion of "classes are objects" ( as I understand it ) implies that anything you can do with an object, you can do it with a class.

This differs from other programming languages where the class and the class definition are special artifacts different from objects and often unaccessible to the runtime.

For instance in Ruby, you can modify any object at runtime, since classes are also objects you can modify the class it self and add methods at runtime, delete methods, or add and delete attributes at runtime.

For instance:

$ irb
>> x = Object.new
=> #<Object:0x1011ce560>
>> x.to_s
=> "#<Object:0x1011ce560>"
>> undef to_s
=> nil
>> x.to_s
NoMethodError: undefined method `to_s' for #<Object:0x1011ce560>
from (irb):4
>> 

That's not possible on other programming languages where a distinction between objects and classes is made.

note: Probably you should understand basic Ruby concepts before going to meta programming as it may be confusing, that what I would do.

Upvotes: 6

Mladen Jablanović
Mladen Jablanović

Reputation: 44090

When you think of it, it's completely logical for new to be a function, right? A function which creates and returns a new object. (Unlike most of other languages where new is some kind of operator or a language construct.)

Pushing it further, even more logical for this function new is that it should be a method, if we are talking about an OO language. Whose method? A method of an object, just a little bit different sort of an object that we can call "class".

So, looking it that way, classes are just special kinds of objects, objects that, among other peculiarities, have method new and know how to create other objects based on their own image.

Upvotes: 0

Chuck
Chuck

Reputation: 237080

It means precisely what it sounds like — classes are objects. Specifically, they are instances of the class Class, which is itself a subclass of the class Module, which in turn is a subclass of Object, just like every other class in Ruby. Like any other object in Ruby, a class can respond to messages, have its own instance variables, etc.

As a practical example, let's take private.

class Person
  attr_accessor :name, :height
  private
  attr_accessor :weight
end

This gives instances of Person public methods to access the person's name and height, but the accessors for the person's weight are private. BUTBUTBUT — rather than being a keyword like in most languages, private is an ordinary method of the Module class. If we wanted, we could redefine it to do something different for a particular class hierarchy.

class RichardStallman
  def self.private(*args)
    puts "NO! INFORMATION WAS MEANT TO BE FREE!"
  end
end

Upvotes: 12

David Seiler
David Seiler

Reputation: 9725

Here's my shot at one.

In Ruby, classes are objects. Usually they have class Class. For example, let's consider the class Foo.

class Foo
end

Doubtless you've seen this before, and it's not terribly exciting. But we could also have defined Foo this way:

Foo = Class.new

Just as you'd create a new Foo by calling Foo.new, you can create a new Class by calling Class.new. Then you give that class the name Foo by assigning it, just like any other variable. That's all there is to it.

Upvotes: 11

Related Questions