Ruby

aus Freepedia, der freien Wissensdatenbank

Bild:Disambig-grau.png Dieser Artikel hat die Programmiersprache Ruby zum Gegenstand, weitere Bedeutungen unter Ruby (Begriffsklärung)

Ruby ist eine objektorientierte, interpretierte Programmiersprache. Sie hat ihre Wurzeln in Perl, Smalltalk, Python, LISP, Bash und CLU.

Yukihiro „Matz“ Matsumoto begann am 24. Februar 1993 mit der Entwicklung der Sprache. 1995 wurde sie erstmals veröffentlicht, die aktuell stabile Version ist 1.8.3, die auf der offiziellen Seite heruntergeladen werden kann. Viele Entwickler sagen, Ruby folge dem „principle of least surprise“, dem Prinzip der geringsten Überraschung, womit sie meinen, dass die Sprache frei von Fallen und Widersprüchen ist, mit denen man bei anderen Programmiersprachen zu kämpfen hat. Der Name „Ruby“ (engl. für Rubin) ist übrigens kein Akronym, sondern eine Anspielung auf Perl (Pearl, engl. Perle).

Lange Zeit verbreitete sich Ruby wegen unzureichender englischer Dokumentation nur in Japan. Dort hat es bereits einen Stellenwert wie Perl und Python, ist praxiserprobt und gilt als stabil. Erst um die Jahrtausendwende startete „Matz“ viele Aktivitäten, um die Sprache Ruby auch außerhalb Japans bekannter zu machen. Sie wurde sehr schnell begeistert aufgenommen und es entstanden zahlreiche Artikel und Dokumentationen in englischer und deutscher Sprache. Es wird jedoch noch einige Jahre dauern, bis Ruby auch in Europa so weit verbreitet ist wie Perl oder Python.

Inhaltsverzeichnis

Merkmale der Sprache

  • Einfache Syntax
  • Rein objektorientierte Sprache, ähnlich Smalltalk
    • Alles ist ein Objekt
    • Mixins: Einbinden von Modulen in eine Klasse (statt Mehrfachvererbung)
    • Singleton-Methoden
    • Umbenennung und Erweiterung vorhandener Klassen zur Laufzeit
    • Iteratoren
    • Operatorüberladung
    • Introspektion (auch als Reflection bekannt)
  • Untypisierte Variablen
  • Ausnahmebehandlung über Exceptions
  • automatische Speicherbereinigung (englisch garbage collection)
  • Unterstützung der regulären Ausdrücke von Perl (leider noch nicht alle Features)
  • Hohe Portabilität (z. B. Unix, Windows, DOS, Mac OS X, OS/2, Amiga usw.)
  • Steht wahlweise unter der GPL oder einer eigenen Lizenz
  • Einheitliche Anbindungen an die meisten Datenbanken
  • Weites Einsatzgebiet (Kommandozeile, grafische Oberfläche, Webapplikation)
  • Interaktive Rubykonsole (irb)
  • Einheitliche Dokumentation direkt im Quellcode, ähnlich JavaDoc (rdoc)
  • Code-Blöcke als Methoden-Argumente, insbesondere als Argumente für Methoden von Iteratoren
  • Closures, Continuations, callcc, binding und lambda als Erbe von funktionalen Sprachen

Ruby ist komplett objektorientiert. Alle Daten sind Objekte, anders als bei Java gilt dies auch für die Basistypen. Mit sehr wenigen Ausnahmen enthält jede Variable eine Referenz auf das Objekt, nicht das Objekt selbst. Weiterhin gibt es (im Gegensatz zu prozeduralen Programmiersprachen) keine Funktionen, sondern lediglich Methoden. Um den Umstieg von prozeduralen Programmiersprachen zu erleichtern, erlaubt es Ruby jedoch, Methoden global zu definieren, welche zur Basisklasse hinzugefügt werden, sowie Methoden ohne expliziten Empfänger aufzurufen. Technisch handelt es sich allerdings um Methoden des Moduls, das heißt der Datei in der die Methode steht. Dadurch kann man, obgleich Ruby selbst objektorientiert ist, auch strukturiert und prozedural programmieren.

Besonders mächtige Konzepte von Ruby sind sehr einfach zu implementierende und verwendbare Mixins und Blöcke als Argumente von Methoden. Erstere erlauben verbesserte Wiederverwendbarkeit und Erweiterbarkeit von Code und erlauben eine Mehrfachvererbung zu simulieren. Letztere machen klassische Schleifen-Konstruktionen und damit verbundene Probleme wie Puffer-Überläufe in vielen Fällen obsolet. Zudem ist Ruby sehr weitgehend introspektiv, so dass sich durch Methoden-Aufrufe oder mit geeigneter Software (z. B. rbbr) eine weitgehende Referenz der verwendeten Klassen einsehen lässt.

Syntax

Die Syntax von Ruby wirkt auf den ersten Blick sehr frei, da Anweisungen nicht wie in vielen Sprachen durch ein Semikolon abgeschlossen werden, solange nur eine pro Zeile angegeben ist. Auch müssen Parameter von Methoden nicht in Klammern gesetzt werden. Verboten ist es aber auch nicht, so dass man es zur Verdeutlichung jederzeit tun kann. Weiterhin fällt auf, dass bei Funktionen und Methoden der Rückgabewert nicht explizit angegeben werden muss. Stattdessen wird automatisch der Wert der letzten Anweisung zurückgegeben.

Abgesehen davon gibt es aber sozusagen keine Doppelspurigkeiten wie in Perl.

Anders als in Python werden Blockstrukturen nicht durch die Einrückung bestimmt, sondern wie bei den meisten Sprachen durch Schlüsselwörter (begin...end, while...end, ...).

Programmierbeispiele

Alle Programmierbeispiele lassen sich mit dem interaktiven Ruby-Interpreter irb testen.

>> -199.abs    # Die Zahl -199 ist ein Objekt der Klasse Fixnum (eine Unterklasse von Integer),
               # dessen Methode ''abs'' wir aufrufen.
=> 199

>> "Ruby ist cool".length    # analog für einen String
=> 13

>> "Rick".index("c")    
=> 2

>> "Wort".swapcase
=> "wORT"

>> "eine note betone nie".reverse.capitalize
=> "Ein enoteb eton enie"

>> #Arrays
?> [11, 5, 7, 2, 13, 3].sort
=> [2, 3, 5, 7, 11, 13]

>> [11, 5, 7, 2, 13, 3].sort.reverse
=> [13, 11, 7, 5, 3, 2]

>> [13, 11, 7, 5, 3, 2].map { |x| x * 2 }
=> [26, 22, 14, 10, 6, 4]

>> [13, [11, [7, [5, 3]], 2]].flatten
=> [13, 11, 7, 5, 3, 2]

>> ["Eins", "Zwei", "Drei"] + ["Eins", "Vier"] - ["Eins"]
=> ["Zwei", "Drei", "Vier"]

>> # Hashes (Assoziative Arrays)
?> { "vorname" => "Heribert", "nachname"=>"Maier", "alter"=>43} 

=> { "alter"=>43, "nachname"=>"Maier", "vorname"=>"Heribert" }

# Gibt zehn mal hintereinander "Hello, world!" in einer neuen Zeile aus
10.times {                                     # Block als Argument der Methode "times"
    string1 = "Hello world".gsub(" ", ", ")    # Ersetze alle Leerzeichen (' ') durch
                                               # Komma mit Leerzeichen (', ') und speichere
                                               # in string1
    string1 << "!"                             # Hänge "!" an string1
    puts string1                               # Ausgabe der Variable string1, gefolgt von
                                               # einem Zeilenumbruch
}

# Gibt die Datei text.txt Zeile für Zeile auf der Standardausgabe (Bildschirm) aus
open("text.txt") { |file|
    file.each { |line|
        puts line
    }
}

# Definition und Aufruf einer Closure
  a = 33
  block = lambda { a }
  def redefine_a(b)
    a = 44
    b.call
  end
  redefine_a(block)   # Ausgabe von 33

# Currying; Prozeduren sind ganz normale Objekte
  def curried_plus(x)
    lambda { |y| x + y }
  end
  plus_one = curried_plus(1)
  plus_one.call(8)    # ergibt 9

Literatur

Deutsche Literatur

Englische Literatur

Weblinks

Projekte in Ruby



Views
'Persönliche Werkzeuge
Werkzeuge
Andere Sprachen
Ähnliche Links