Klassen sind Objekte

Ruby ist eine konsequent objektorientierte Sprache. Es gibt keine primitiven Datentypen. Es gibt nur Objekte. Selbst Klassen sind Objekte. Sie werden auch “first-class” Objekte genannt. Jede abgeleitete Klasse ist auch immer eine Objektinstanz.

Das Ruby Klassenmodell

Objekte sind Instanzen einer Klasse. Und eine Klasse ist eine Instanz seiner Elternklasse.
Das läßt sich leicht nachweisen. Ein Beispiel:

class Product
end

Die Klasse Product ist eine leere Klasse, die automatisch von Class abgeleitet ist:

Product.class # => Class

Doch ihre Superklasse:

Product.superclass # => Object

ist tatsächlich Object. Das bedeutet, dass jede Klasse auch sämtliche Methoden von Object erbt.
Also jede Produktinstanz hat daher bestimmte Instanzmethoden, wie zum Beispiel:

product = Product.new
product.dup # => #<Product:0x00000004b9e980>
product.send(:dup) # => #<Product:0x00000004b82690>
product.is_a? Object # => true

Und weil jede Klasse auch eine Instanz seiner Elterklasse ist, können die gleichen Instanzmethoden auch auf die Klasse angewendet werden:

Product.dup # => #<Class:0x00000004b70170>
Product.send(:dup) # => #<Class:0x00000004b53a48>
Product.is_a? Object # => true

Jedes Objekt hat eine object_id:

Product.new.object_id # => 36039100

Und jede Klasse hat ebenfalls eine object_id:

Product.object_id # => 36039160

Klasseninstanzvariablen

Ein weiteres Merkmal von Objekten sind Instanzvariablen. Sie sind gekennzeichnet durch ein einfaches @.
Klassen können ebenfalls Instanzvariablen (mit einem einfachen @) haben. Da sie aber im Klassenkontext gültig sind, werden sie Klasseninstanzvariablen genannt. Dabei besteht ein klarer Unterschied zu Klassenvariablen (mit @@), der insbesondere in der Vererbung eine Rolle spielt.
Ein Beispiel:

class Product
  @@vat_factor     = 0.19
  @warranty_months = 6
end

Ein Produkt hat die Klassenvariable @@vat_factor, aber auch eine Klasseninstanzvariable @warranty_months.
Zunächst die Klassenvariablen:

Product.class_variables # => [:@@vat_factor]

Außerdem die Klasseninstanzvariablen:

Product.instance_variables # => [:@warranty_months]

Eine Produktinstanz hat keine Instanzvariablen:

Product.new.instance_variables # => []

und auch keinen direkten Zugriff auf die Klasseninstanzvariablen:

Product.new.instance_variable_get :@warranty_months # => nil
Product.instance_variable_get :@warranty_months # => 6