Die Programmiersprache Ruby

Blog| Forum| Wiki  

Ruby als objektorientierte Programmiersprache kennt eine Hierarchie von Objekten, welche Methoden beherrschen. Dies steht im Gegensatz zu prozeduralen Programmiersprachen wie C, in denen die Zielaufgabe in immer kleinere Probleme zerlegt wird, deren kleinstes Element man dann Funktion nennt. In Ruby läuft der Hase anders. Objektorientierung ist sozusagen der Versuch, die reale Welt in die Programmierung einfließen zu lassen. Ein Objekt ist immer ein Ding, ein irgendwas, dass man als eben dieses Irgendwas klassifizieren kann. Diese Eigenart ist wie schon beschrieben aus der realen Welt genommen: Gehst du durch einen Wald, klassifizierst du das Gebilde neben dir vermutlich als Baum (es soll Ausnahmen geben, OK. Wenn du dazu gehörst, entschuldige ich mich hier), also ein dir bekanntes Objekt. Je nachdem, wie weit deine Naturkenntnisse reichen, erkennst du es vielleicht sogar als Birke, Fichte oder Ibex. Nichts anderes sind die Objekte in Ruby: Dinge, die verschiedene Fähigkeiten haben. Womit wir auch schon beim nächsten Punkt wären: Fähigkeiten. Diese Fähigkeiten, die ein Objekt, sagen wir eine Birke, hat, nennt man Methoden. Eine jede Birke kann Wasser aufnehmen, also ist die Fähigkeit, Wasser aufzunehmen, eine Methode eines Birke-Objekts.
Vielleicht wird die Situation durch etwas Quellcode klarer. In Ruby definiert man sogenannte Klassen. Klassen sind, ähnlich wie die Klassifizierungen in der Biologie, Beschreibungen von Objekten. Man könnte sie auch Baupläne für ein Objekt nennen. Klassen werden in Ruby mit dem Schlüsselwort class definiert, Methoden mit def. Demzufolge sähe der Bauplan für unsere Birkenklasse wie folgt aus:

1
2
3
4
5
class Birke
  def wasser_aufnehmen
    "Gluck, gluck..."
  end
end

Dies legt fest, dass jedes Objekt, dass sich eine echte Birke nennen will, die Fähigkeit besitzt, Wasser aufzunehmen. Nun wissen wir aber auch, dass, wenn wir uns im Wald zwei Birken ansehen, diese nicht exakt gleich aussehen. Auch dies wird in Ruby umgesetzt, schauen wir es uns einfach mal an. Um ein neues Objekt mithilfe unseres Birken-Bauplans zu erzeugen, benutzen wir die Methode new des Bauplans (der ist schließlich auch ein Objekt und kann demnach Fähigkeiten, Methoden haben). Außerdem gibt Ruby jedem Objekt die Fähigkeit, sich selbst programmweit einzigartig zu identifizieren, nämlich über die Methode object_id. Diese ID ist für dieses Objekt einzigartig. Und mithilfe dieser ID lässt sich belegen, dass unsere zwei Birken nicht gleich sind:

1
2
3
4
5
6
7
8
9
10
11
class Birke
  def wasser_aufnehmen
    "Gluck, gluck..."
  end
end

birke1 = Birke.new
birke2 = Birke.new

puts birke1.object_id
puts birke2.object_id

Hier können wir außerdem erkennen, dass Methoden von speziellen Objekten mithilfe des Punkts . aufgerufen werden. Warum puts keinen Punkt braucht? Stört dich das wirklich? Nagut, dann schreib' halt Kernel.puts, wenn's dir lieber ist.
Speichere diesen Text in die Datei »birke.rb« und führe sie aus. Das Ergebnis sollte so oder ähnlich aussehen:

1
2
69470520
69470506

Das ist der Beweis, dass es sich nicht um die gleichen Objekte handelt.
Diese Stelle ist außerdem gut dazu geeignet, um ein Wort über Rubys Namenskonvetionen zu verlieren. Wie es ja schon gezeigt wurde, Klassennamen beginnen groß und gehen dann klein weiter. Variablen, wie in unserem Beispiel birke1 und birke2, werden komplett klein geschrieben. Mehrwörtige Variablen werden durch Unterstriche _ erzeugt: das_ist_ein_langer_variablenname. Klassennamen bilden eine Ausnahme: DasIstEinLangerKlassenname.
Soweit, so gut. birke1 ist also eine Variable. Variablen sind Verweise auf ein Objekt, d.h. jede Variable verweist auf irgendein Objekt, unsere birke1-Variable verweist also auf ein Birke-Objekt, birke2 auf ein anderes Birke-Objekt. Es ist auch möglich, das zwei Variablen auf dasselbe Objekt verweisen, dazu müssten wir schreiben:


auch_birke2 = birke2

So können wir mit zwei verschiedenen Variablen auf dasselbe Objekt zugreifen. Dies demonstriert auch das sogenannte By reference-Verhalten von Ruby. Statt dem Wert eines Objekts (das wäre By value-Verhalten) wird der Verweis, die Referenz auf das Objekt, übergeben, was Code wie den obigen möglich macht. Von diesem Verhalten gibt es allerdings einige wenige, dennoch aber logische Ausnahmen. Diese nennt man Immediate Values, zu deutsch »Direktwerte«. Diese Objekte werden immer by value übergeben. Zahlen sind z.B. solche Immediate Values:

1
2
3
4
5
x = 1
y = x
y = y + 1
puts x #=> 1
puts y #=> 2

Das #-Zeichen leitet Kommentare ein. Das sind Textpassagen, die vom Ruby-Interpreter ignoriert werden und können somit für Informationen zum Code benutzt werden. Wir benutzen #=> in diesem Tutorial um Ausgaben auf der Kommandozeile zu kennzeichnen.
Das Resultat dieser Rechnung macht deutlich, dass y keinen Verweis auf x hält, sondern den Wert von x übernommen hat. Das liegt in der Natur von Zahlen: Es wäre sinnlos, wenn es zwei leicht unterschiedliche Zweien gäbe, wie es im Wald zwei leicht unterschiedliche Birken gibt. Wer sich überzeugen möchte kann das gerne ausprobieren:

1
2
puts 2.object_id
puts 2.object_id

Es handelt sich demnach immer um dieselbe 2. Aus diesem Grunde ist sie ein Immediate Value.
Ganz nebenbei haben wir hier eine von Rubys bemerkenswertesten Eigenschaften eingeführt: EIAO. Das englische Akronym steht für Everything is an object, was auf Deutsch soviel heißt wie Alles ist ein Objekt. Ruby setzt dieses Konzept vollständig um. Auch Zahlen, die in vielen Programmiersprachen als sogenannte »Primitive« angesehen werden, behandelt Ruby als Objekt und gibt ihnen so die Fähigkeit, Methoden wie object_id zu beherrschen. Etwas deutlicher wird das vielleicht, wenn man sich anschaut, wie man überprüft, ob eine Zahl gerade ist. Während man in vielen Programmiersprachen soetwas schreiben muss wie:


IsEven(3)

, fragt Ruby einfach die Zahl selbst, ob sie gerade ist:


3.even?




Gut. Lass das auf dich wirken: die Tatsache, dass alles ein Objekt ist, wie man Objekte erzeugt, was Klassen und was Methoden sind - dies sind essentielle Dinge in der Rubyprogrammierung. Vielleicht hast du ja schon Tutorials zu anderen Sprachen gelesen und wunderst dich, weshalb wir nicht mit den üblichen Matheaufgaben oder einfachen Progrämmchen beginnen. Nun, das liegt daran, dass das Konzept der Objekte in Ruby wirklich wichtig ist. Ohne ein gewisses Verständnis von Objekten ist es schwierig bis unmöglich, qualitativ hochwertige Ruby-Programme zu schreiben. Im Übrigen macht es doch auch mehr Spaß, gleich richtig zur Sache zu gehen und nicht ewig lange bei den einfachsten Dingen zu verweilen, oder? Rein theoretisch könntest du jetzt deine eigenen Ausflüge in die Welt von Ruby beginnen, du weißt, was Objekte sind und wie sie sich verhalten, wie du neue erstellst und was du tun musst, damit sie ihre Methoden durchführen. Praktisch dürfte es sich aber noch als etwas schwierig erweisen, denn es gibt noch viele Dinge, die neben diesem Wichtigsten ebenfalls einen hohen Stellenwert genießen. Alles dazu Wissenswerte findest du im nächsten Kapitel.

^ Zurück zum Inhalt | ? Nächstes Kapitel