Die Programmiersprache Ruby

Blog| Forum| Wiki  

Die Artikel EIAO und Objekt-Orientiert überschneiden sich inhaltlich. Bitte hilf mit, das zu verbessern, indem du die Artikel unter einem Namen zusammenführst.
Bitte entferne anschließend den Redundanz-Baustein.

Inhaltsverzeichnis

Allgemein

In Ruby ist so gut wie alles ein Objekt (engl. everything is an object, EIAO). Das gehört eigentlich zu den Grundprinzipien von Objektorientierten Programmiersprachen, wird aber nur selten[1] so strikt wie in Ruby umgesetzt. Bis auf wenige Dinge wie Schlüsselwörter, self, nil, true und false sind tatsächlich sämtliche Dinge ein Objekt. Die oberste Superklasse aller[2] Objekte in Ruby ist Object, was bedeutet, dass jedes Objekt in Ruby die Methoden der Klasse Object implementiert. Diese Klasse mixt zudem das Modul Kernel ein, sodass jede Klasse die Methoden dieses Moduls ebenfalls beherrscht. Beispiel:

1
2
3
4
5
6
7
#Die Klasse Object definiert die Methode object_id
#Also muss diese jedes Objekt k��nnen!
class A
  #Keine Methoden!
end
x = A.new
x.object_id #=> z.B. 50284540

Die Methoden eines Objekts (einschliesslich der von Object und Kernel) lassen sich mit Object#methods auflisten.

Primitive Datentypen

Auch Zahlen, Strings und Ähnliches sind Objekte[1]! Das mag manchen erstaunen, aber es ist tatsächlich so: Jede Zahl, sei sie noch so klein, groß, lang oder sonstwie, ist in Ruby ein Objekt, eine Instanz einer der numerischen Klassen Fixnum, Bignum oder Float. Gleiches gilt auch für Strings und Ähnliche sonst "Primitive Datentypen". Das bedeutet natürlich, dass Zahlen und ähnliche Objekte Methoden beherrschen müssen, zumindest die der obersten Klasse Object. Und tatsächlich ist es auch so: Die Operatoren zum Beispiel sind Methoden (Methoden sind Instanzen der Klasse Method) der Klasse Integer (der Superklasse von Fixnum und Bignum) und Float. Wie das? Methoden werden doch bekannterweise mit objekt.methode(argumente) aufgerufen? Im Grunde ja, aber es gibt für manche Methodennamen Kurzschreibweisen, unter anderem für Operatoren. Aber auch diese lassen sich "standardkonform" schreiben:

1
2
3
1 + 2
#Ist gleich
1.+(2)

Methoden, die schon eher nach solchen aussehen, wären zum Beispiel upto, downto und times; oder für String split:

1
2
3
4
5
6
7
8
9
1.upto(3) do |zahl|
  #Code...
end

45.times do |zahl|
  #Code...
end

"Ruby ist toll!".split(" ") #=> ["Ruby", "ist", "toll!"]

So wie Zahlen und Strings verhalten sich dementsprechend auch alle anderen "Elementaren Datentypen", die in Ruby solche eben nicht sind.

Pseudovariablen

Ausnahmen von der EIAO-Regel sind, wie schon genannt, die Pseudovariablen false, nil, true und self. Wobei auch die ersten drei eigentlich Objekte sind, Instanzen von FalseClass, NilClass und TrueClass. Nur, hat es einen Sinn, wenn man nach dem Motto "Nee, die Bedingung ist doch nicht so ganz wahr, eher so eine Halbwahrheit" eine Instanz halbtrue der Klasse TrueClass (oder sogar FalseClass?) erstellt?

self

Eine Besonderheit stellt self da. Dieser Ausdruck ist definitiv kein Objekt, er ist eine Art Verweis auf das aktuell agierende Objekt. self hat nie einen bestimmten Wert:

1
2
3
4
5
6
7
8
9
10
class A
  def initialize
    puts self #=> A:irgendeine_objektid
  end
end
class B
  def initialize
    puts self #=> B:irgendeine_objektid
  end
end


Schlüsselwörter

Und dann sind da natürlich noch die Schlüsselwörter if, then, def, while, until, yield, usw. Aber hier würde es keinen Sinn machen, eine Klasse einzuführen. Denn praktisch niemand würde eine neue "if-Instanz" einführen, bisher zumindest hat sich niemand über den if-Block beschwert.

Zusammenfassung

Aber im Grunde ist wirklich alles außer den Schlüsselwörtern ein Objekt. Jeder einzelne, noch so unbedeutende Verweis, und wenn es nur der GC ist, ist ein Objekt (und das sollte man im Sinne von Speicherplatznutzung auch beachten), ein Objekt, dass mindestens die Methoden von Object und aus Kernel beinhaltet[2][3].

Fußnoten

[1]Man nehme zum Beispiel Python: Zahlen sind keine Objekte, sie sind dort "Basisdatentypen"

[2]Es gibt eine Ausnahme: Das facets-Gem definiert eine Klasse, BasicObject, die sich tatsächlich von keiner Klasse ableitet.

[3]In Ruby 1.9 wird es möglich sein, Klassen auch direkt von "BasicObject" anstatt von "Object" abzuleiten, was Probleme verursachen kann:

1
2
3
4
5
6
7
8
9
#Ruby 1.9.0
class Dummy < BasicObject
 def p
  puts :hello
 end
end

d = Dummy.new
# => NoMethodError: undefined method `inspect' for #<Dummy:0x94150d8>

Siehe auch