Auch Python ist (wie Ruby) eine dynamische Allzweck-Scriptsprache, und gehört somit zur engen Familie der agilen Sprachen. Im Vergleich zu Python gibt es in Ruby allerdings ein wenig mehr Syntax zu lernen. Mehr über Python findest du auf der Python-Website.
Ruby verletzt die Regeln des Python-Zen und kann Perl ähnlich sehen, was viele Pythonisten abschreckt. Bei genauerem Hinsehen wird deutlich, dass beide Sprache sehr ähnliche Ziele verfolgen, diese aber mit unterschiedlichen Mitteln erreichen.
Die Communities von Python und Ruby sind deshalb oft in produktivem Kontakt.
Ähnlichkeiten
Spracheigenschaften
- Alles ist ein Objekt, und Variablen sind Referenzen auf Objekte.
- Die Typisierung ist dynamisch, aber stark. Auch in Python ist Duck Typing verbreitet.
- Klassen sind offen und können nach Belieben erweitert werden.
- Objekte und Klassen können eigene Methoden besitzen.
- Introspektion und Meta-Programmierung sind möglich.
- Operatoren wie
+
oder[]
können überschrieben werden. - Exceptions arbeiten ähnlich (wenn auch mit anderer Syntax).
Tools und Bibliotheken
- Ruby selbst ist ein Interpreter:
ruby
. - Ruby hat ein interaktives Interface:
irb
. - Es gibt ein eingebautes Dokumentations-Tool:
rdoc
- Man kann die Dokumentation über die
Kommandozeile1 lesen:
ri
. - Die verbreiteten Editoren bieten mittlerweile guten Ruby-Support.
- Es gibt eine reichhaltige Bibliothek.
- Es gibt moderne Web-Frameworks ;-)
1 Zur Zeit bietet ri leider noch keine Informationen zur Sprache selbst, sondern nur zu eingebauten Klassen und Bibliotheken. Dafür gibt es die erste Version der Pickaxe (das bekannteste Ruby-Referenz-Buch) online auf Englisch.
Syntax
- Anweisungen benötigen kein Semikolon und enden mit der Zeile.
- Die meisten Schlüsselworte sind dieselben wie in Python.
- Eckige Klammern erzeugen Listen, geschweifte Klammern erzeugen
Hashes (Rubys dict). Schlüssel und Wert werden allerdings mit
=>
getrennt anstatt mit Doppelpunkten. - Auch Ruby neigt dazu, wesentlich kürzer zu sein als Java oder C.
Unterschiede
Spracheigenschaften
- Die Realisierung von Klassen, Attributen und Methoden unterscheidet sich stark von Python.
- Es gibt keine new style- und old style-Klassen.
- Man greift niemals direkt auf Instanzvariablen zu. In Ruby ruft man immer nur Methoden auf. Da in Ruby Klammern optional sind, kann man aber Methoden erstellen, die sich wie Attribute anfühlen (wie Properties in Python).
- Es gibt
public
,private
undprotected
, um Zugriff auf Methoden zu steuern. - Mixins werden anstelle von Mehrfachvererbung benutzt.
- Man darf auch eingebaute Ruby-Klassen verändern.
- Es gibt Konstanten (die eine Warnung erzeugen, wenn man ihren Wert ändert.)
- Es gibt nur einen Listentyp (
Array
), der seinen Wert verändern kann, und der gleichzeitig als Tupel, Liste, Stack, Queue und Set fungiert. Für effiziente Mengenalgorithmen benutzt man allerdingsSet
. - In Ruby läd man zusätzliche Dateien mit
require 'filename'
anstatt mitimport modulename
. Modul- und Ordnerhierarchien sind nur durch Konvention miteinander verbunden. Es gibt keine direkten Entsprechungen zufrom...import
undimport...as
. - Ruby hat globale Variablen (
$foo
), die aber selten verwendet werden.
Strings, Symbole und Reguläre Ausrücke
- Ruby-Strings können ihren Wert ändern (sind also mutable).
- In Ruby werden statt Strings häufig Symbole verwendet, wenn der Inhalt des Strings nicht der Ausgabe dient. Symbole sind im Gegensatz zu Strings nicht veränderbar und existieren nur einmal im Speicher.
- In Ruby verhalten sich Strings in
'einfachen'
Anführungszeichen wie Pythonsr"aw strings"
. - Alle Stringtypen dürfen mehrzeilig sein; anstatt Triple-Quotes
werden häufig
<<-HEREDOCS
eingesetzt. - Interpretierte Stringliterale (
"solche"
und%Q[solche]
) dürfen"#{Ruby-Code}"
enthalten. Der Wert des Ausdrucks wird in einen String verwandelt und direkt eingefügt. - Ruby kennt auch Pythons Format-Strings samt
%
-Methode; man verwendet allerdings Arrays statt Tupeln, um mehrere Argumente zu übergeben. - Für reguläre Ausdrücke gibt es eine
/(?:einge\baute) Synta/x
. - Die Ergebnisse des letzten Matches werden in den aus Perl bekannten
Variablen
$1
,$&
,$`
usw. abgelegt (diese Variablen sind allerdings lokal.) Für Objektorientierte gibt es die KlassenRegexp
undMatchData
.
Syntax
- Einrückung ist in Ruby freiwillig. Mehrzeilige Anweisungen werden
mit
end
beendet. - Kein explizites
self
in Methodensignaturen. - Ruby hat Blöcke, die vielfältig eingesetzt werden.
- In Ruby ist alles ein Ausdruck, so dass Code-Elemente fast beliebig kombiniert werden können.
- Implizites
return
: Der Wert des letzten Ausdrucks einer Methode wird zurückgegeben. Man kannreturn
aber auch wie in Python explizit angeben. - Es gibt ein paar erzwungene Namenskonventionen (z.B. beginnen Klassennamen immer mit einem Großbuchstaben, Variablen werden dagegen klein geschrieben.)
- Methoden können ohne Klammern aufgerufen werden (
require 'set'
usw.) Das hat zur Folge, dass man auf Methodenobjekte nur überobj.method :name
zugreifen kann, die dann mittelsmeth.call
odermeth[]
aufgerufen werden. - Instanzen werden mit
Foo.new
erstellt, nicht mitFoo()
. Die zugehörige Methode heißtinitialize
statt__init__
. true
,false
undnil
sind RubysTrue
,False
undNone
.- In Bedingungen sind nur die Werte
nil
undfalse
negativ. Alles andere (0, leere Strings und Listen usw.) ist positiv. - Ruby benutzt
elsif
stattelif
. - Namespaces werden mit dem
::
-Operator verknüpft, mit dem man auch auf Konstanten wieMath::PI
zugreift. - Ruby hat keine echten Keyword-Argumente; stattdessen werden Hashes mit optionalen Klammern eingesetzt.
- Ruby hat keine List-Comprehensions; stattdessen benutzt man die
Methoden des Moduls
Enumerable
.
Konventionen
- Namen: Methoden und Variablen jeder Art sind
under_score
, KlassenCapitalCase
und KonstantenALL_CAPITAL_CASE
. - Kommentare stehen über den Methoden und Klassen, wie in Java.
- Das Ändern eingebauter Klassen ist nicht geächtet, sondern wird fröhlich praktiziert.
- Eingerückt wird mit zwei Leerzeichen.