A.7 Ruby
Ruby ist ähnlich wie Python eine interpretierte, dynamisch typisierte objektorientierte Skriptsprache. Sie wurde von Yukihiro Matsumoto 1993 erfunden, der mit Python und dessen Objektorientierung nicht ganz zufrieden war. Der Name Ruby wurde von der Skriptsprache Perl inspiriert – es ist der Name eines Edelsteins. [Ja, wir wissen, dass Perlen keine Steine sind und möchten an dieser Stelle die Leistungen der Muscheln nicht verschweigen. ]
Ruby kann man tatsächlich als eine rein objektorientierte Programmiersprache betrachten. Sie kennt keine globalen Routinen, jede Funktion und jede Prozedur ist eine Methode einer Klasse oder eines Objekts.
In Ruby kann man bereits bestehende Klassen und auch die Klasse object um neue Methode erweitern, die dann jedem neuen und jedem bereits existierenden Objekt zur Verfügung stehen. Dies ist den globalen Methoden recht ähnlich, unterscheidet sich von ihnen aber dennoch, denn die Methoden haben Zugriff auf die Datenelemente des konkreten aufgerufenen Objekts.
Syntax von Ruby
In Gegensatz zu Python ist die Einrücktiefe in Ruby nicht relevant. Die Gruppen von Anweisungen werden meistens durch das Schlüsselwort end geschlossen.
Eines der wichtigsten Merkmale von Ruby ist die Verwendung von Blöcken. Ein Block ist eine anonyme Methode, die in anderen Methoden deklariert werden kann. Ein Block kann entweder durch das Schlüsselwortpaar do/end markiert werden oder durch ein Paar der geschweiften Klammern { und }.
Doch auch in Ruby kann man sich so manche Klammer sparen. Hier sind nämlich die Klammern bei einem Funktionsaufruf optional. So kann man Math.sin(1.0) auch als Math.sin 1.0 schreiben. Die Klammern sind nur dann notwendig, wenn sonst nicht eindeutig wäre, wo die Liste der Parameter aufhört.
Schauen wir uns die Implementierung einer Versionsnummer in Ruby an:
class VersionNumber < Object def initialize(parts) @parts = parts.clone end end v = VersionNumber.new [1, 2, 3]
- Hier deklarieren wir die Klasse VersionNumber, die von der Klasse Object abgeleitet wird. Die Vererbung von der Klasse Object müssten wir nicht explizit angeben, wir machen es nur, um die Syntax der Vererbungsbeziehung in Ruby zu demonstrieren. Die Namen der Klassen in Ruby fangen immer mit einem Großbuchstaben an.
- Die Methode initialize wird beim Erzeugen eines neuen Exemplars der Klasse aufgerufen. Sie erwartet einen Parameter mit dem Namen parts.
- Die Datenelemente eines Objekts werden in Ruby mit dem Präfix @ markiert. So kann man Parameter und lokale Variablen von den Datenelementen der Objekte unterscheiden. Die Datenelemente der Objekte sind immer privat. Mit dem doppelten Präfix @@ werden klassenbezogene Datenelemente bezeichnet.
- Hier erstellen wir ein neues Exemplar unserer Klasse.
Moment mal, haben wir nicht etwas vergessen? Unsere Klasse braucht doch noch die Methode, die ihre Exemplare als eine Zeichenkette ausgeben kann. Kein Problem für Ruby, wir können die Klasse einfach um eine neue Methode erweitern:
class VersionNumber def to_s result = ''; sep = '' @parts.each do |element| result += sep + element.to_s sep = '.' end return result end end print v # gibt 1.2.3 aus
- Wir deklarieren hier keine neue Klasse VersionNumber, wir wechseln lediglich den Kontext, um die neu definierten Methoden der bereits bestehenden Klasse VersionNumber zuzuweisen.
- Wir überschreiben die geerbte Methode to_s. Wir müssen keine Klammern eingeben, weil die Methode keine Parameter erwartet.
- Wenn man mehrere Statements auf derselben Zeile angibt, muss man sie durch ein Semikolon trennen.
- each ist hier kein Schlüsselwort, es ist eine Methode der Liste @parts, die als Parameter einen Block erwartet. Der Block, eine anonyme Methode, wird in das Paar do/end eingeschlossen und erwartet einen Parameter, den wir hier element nennen. Die Methode each ruft den Block nacheinander für alle Elemente der Liste auf.
- Hier verlassen wir die Methode to_s und geben den Inhalt der lokalen Variablen result zurück. An dieser Stelle ist das Schlüsselwort return nicht wirklich notwendig. Eine Methode gibt nämlich immer den letzten in ihr ausgewerteten Ausdruck zurück. Hier würde also der Text result reichen. Das Schlüsselwort return braucht man nur dann, wenn man eine Methode vor ihrer letzten Anweisung verlassen oder in einer Prozedur nichts zurückgeben möchte.
Ressourcen
Die erste Seite, die man besuchen sollte, wenn man sich für Ruby interessiert, ist http://www.ruby-lang.org. Ruby hat in letzter Zeit wegen des Frameworks Ruby on Rails sehr viel an Popularität gewonnen. Mehr erfahren über Ruby on Rails kann man unter http://www.rubyonrails.org/.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.