Wenn du zum ersten Mal Ruby-Code siehst, wird er dich wahrscheinlich an
andere Programmiersprachen erinnern, die du benutzt hast. Das ist
Absicht. Der größte Teil der Syntax ist (unter anderem) Perl-, Python-
und Java-Programmierern vertraut. Wenn du diese Sprachen also schon mal
benutzt hast, wird das Lernen von Ruby ein Kinderspiel.
{: .summary}

Dieses Dokument besteht aus zwei Teilen: Der erste versucht, eine
Dauerfeuer-Zusammenfassung darüber zu geben, was dich erwartet, wenn du
von *Sprache X* zu Ruby wechselst. Der zweite Teil geht auf die
Hauptbestandteile von Ruby ein und vergleicht sie mit Konstrukten
anderer Sprachen, die du bereits kennst.

## <span style="font-size:0.9em;;">Von *Sprache X* zu Ruby: Was erwartet mich?</span>

* [Von C und C++ zu Ruby](to-ruby-from-c-and-cpp/)
* [Von Java zu Ruby](to-ruby-from-java/)
* [Von Perl zu Ruby](to-ruby-from-perl/)
* [Von PHP zu Ruby](to-ruby-from-php/)
* [Von Python zu Ruby](to-ruby-from-python/)

## Wichtige Features und ein paar Fallen

Hier sind ein paar Hinweise zu wichtigen Ruby-Features, denen du beim
Lernen begegnen wirst.

### Iteration

Zwei Dinge, denen du in dieser Form vermutlich noch nicht begegnet bist,
und an die man sich ein wenig gewöhnen muss, sind Blöcke und Iteratoren.
In Ruby iteriert man weder über einen Index (wie in C), noch über eine
Liste (wie in Perls `for (@a) {...}` oder Pythons `for item in aList:`),
sondern in den meisten Fällen so:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">some_list</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">item</span><span class="o">|</span>
  <span class="c1"># Wir sind im Innern des Blocks</span>
  <span class="c1"># und arbeiten mit item.</span>
<span class="k">end</span></code></pre></figure>

Mehr zu `each` (und seine Artgenossen `collect`/`map`, `find`, `inject`,
`sort` etc.) erfährst du über `ri Enumerable`
(bzw. `ri Enumerable#methodenname`).

### Alles hat einen Wert

Es gibt in Ruby keinen Unterschied zwischen einem Ausdruck und einer
Anweisung. Alles hat einen Wert, auch wenn er manchmal nur `nil` ist.
Damit ist so etwas möglich:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">y</span> <span class="o">=</span> <span class="mi">11</span>
<span class="n">z</span> <span class="o">=</span> <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">y</span>
      <span class="kp">true</span>
    <span class="k">else</span>
      <span class="kp">false</span>
    <span class="k">end</span>
<span class="n">z</span> <span class="c1"># =&gt; true</span></code></pre></figure>

### Symbole sind keine Strings

Viele Ruby-Anfänger kämpfen damit, zu verstehen, was Symbole sind und
wofür sie benutzt werden können.

Symbole sind am einfachsten als Identitäten (IDs) zu verstehen. Bei
einem Symbol ist wichtig, *wer* es ist, nicht *was* es ist. Starte `irb`
und du siehst den Unterschied:

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):001:0&gt;</span><span class="w"> </span><span class="ss">:george</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="ss">:george</span><span class="p">.</span><span class="nf">object_id</span>
<span class="p">=&gt;</span> <span class="kp">true</span>
<span class="gp">irb(main):002:0&gt;</span><span class="w"> </span><span class="s2">"george"</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="s2">"george"</span><span class="p">.</span><span class="nf">object_id</span>
<span class="p">=&gt;</span> <span class="kp">false</span>
<span class="gp">irb(main):003:0&gt;</span></code></pre></figure>

Die Methode `object_id` liefert die ID eines Objektes. Haben zwei
Objekte dieselbe `object_id`, dann sind sie identisch (zeigen auf
dasselbe Objekt im Speicher.)

Wie du siehst, zeigt jedes gleichnamige Symbol auf dasselbe Objekt im
Speicher, und zwar von dem Moment an, in dem du das Symbol zum ersten
mal benutzt. Zwei Symbole mit denselben Zeichen haben die selbe `object_id`.

Die Strings hingegen (`"george"`) haben eine unterschiedliche `object_id`.
Das bedeutet, dass sie auf zwei verschiedene Objekte im Speicher zeigen.
Immer wenn du einen neuen String benutzt, reserviert Ruby dafür Speicher.

Wenn du nicht genau weißt, ob du ein Symbol oder einen String brauchst,
überlege dir, was wichtiger ist: die Identität des Objektes (z. B. ein
Schlüssel in einem Hash) oder sein Inhalt (“george” im obigen Beispiel).

### Alles ist ein Objekt

Das ist keine Übertreibung. Sogar Klassen und Zahlen sind Objekte, und
du kannst mit ihnen dasselbe tun wie mit jedem anderen Objekt:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Das ist dasselbe wie</span>
<span class="c1"># class MyClass</span>
<span class="c1">#   attr_accessor :instance_var</span>
<span class="c1"># end</span>
<span class="no">MyClass</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span> <span class="k">do</span>
  <span class="nb">attr_accessor</span> <span class="ss">:instance_var</span>
<span class="k">end</span></code></pre></figure>

### Variable Konstanten

Konstanten sind in Ruby nicht wirklich konstant. Wenn du eine schon
initialisierte Konstante veränderst, wird eine Warnung erzeugt, aber das
Programm läuft weiter. Was nicht heißt, dass du Konstanten umdefinieren
*solltest*.

### Namenskonventionen

Ruby erzwingt einige Namenskonventionen. Wenn ein Bezeichner mit einem
Großbuchstaben beginnt, dann ist er eine Konstante. Beginnt er mit einem
Dollarzeichen (`$`), dann ist er eine globale Variable. Wenn er mit `@`
anfängt, ist es eine Instanzvariable, und Klassenvariablen beginnen mit
`@@`.

Methodennamen dürfen allerdings auch mit einem Großbuchstaben beginnen.
Das kann zu Verwirrung führen, wie das folgende Beispiel zeigt:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="no">Constant</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">def</span> <span class="nf">Constant</span>
  <span class="mi">11</span>
<span class="k">end</span></code></pre></figure>

Nun hat `Constant` den Wert 10, aber die Funktion `Constant()` gibt 11
aus.

Nützlich ist dies, wenn man eine Methode genauso nennen möchte wie eine
Klasse. Die folgenden Aufrufe generieren drei mal dasselbe Array mit den
Zahlen von 1 bis 5:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">five1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span>
<span class="c1"># Klasse Array</span>
<span class="n">five2</span> <span class="o">=</span> <span class="no">Array</span><span class="p">.</span><span class="nf">new</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span> <span class="o">&lt;&lt;</span> <span class="mi">4</span> <span class="o">&lt;&lt;</span> <span class="mi">5</span>
<span class="c1"># Methode Array</span>
<span class="n">five3</span> <span class="o">=</span> <span class="no">Array</span><span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">5</span><span class="p">)</span></code></pre></figure>

### Benannte Argumente

Seit Ruby 2.0 können Methoden wie auch in Python mit benannten Argumenten
(Keyword-Argumenten) aufgerufen werden:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">deliver</span><span class="p">(</span><span class="ss">from: </span><span class="s2">"A"</span><span class="p">,</span> <span class="ss">to: </span><span class="kp">nil</span><span class="p">,</span> <span class="ss">via: </span><span class="s2">"mail"</span><span class="p">)</span>
  <span class="s2">"Sending from </span><span class="si">#{</span><span class="n">from</span><span class="si">}</span><span class="s2"> to </span><span class="si">#{</span><span class="n">to</span><span class="si">}</span><span class="s2"> via </span><span class="si">#{</span><span class="n">via</span><span class="si">}</span><span class="s2">."</span>
<span class="k">end</span>

<span class="n">deliver</span><span class="p">(</span><span class="ss">to: </span><span class="s2">"B"</span><span class="p">)</span>
<span class="c1"># =&gt; "Sending from A to B via mail."</span>
<span class="n">deliver</span><span class="p">(</span><span class="ss">via: </span><span class="s2">"Pony Express"</span><span class="p">,</span> <span class="ss">from: </span><span class="s2">"B"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"A"</span><span class="p">)</span>
<span class="c1"># =&gt; "Sending from B to A via Pony Express."</span></code></pre></figure>

### Die reine Wahrheit

In Ruby wird alles außer `nil` und `false` als Wahr (true) behandelt. In
C, Python und vielen anderen Sprachen verhalten sich die Zahl 0, leere
Listen und andere Werte als Unwahr (false). Sieh dir dazu folgenden
Python-Code an (das Beispiel funktioniert auch in anderen Sprachen):

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c1"># in Python
</span><span class="k">if</span> <span class="mi">0</span><span class="p">:</span>
  <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">0 ist true</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
  <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">0 ist false</span><span class="sh">"</span><span class="p">)</span></code></pre></figure>

Hier wird “0 ist false” ausgeben. Dasselbe in Ruby:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># in Ruby</span>
<span class="k">if</span> <span class="mi">0</span>
  <span class="nb">puts</span> <span class="s2">"0 ist true"</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"0 ist false"</span>
<span class="k">end</span></code></pre></figure>

Ruby gibt “0 ist true” aus.

### Sichtbarkeits-Modifikatoren gelten bis zum Ende des Blocks

Im folgenden Ruby-Code:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">MyClass</span>
  <span class="kp">private</span>
  <span class="k">def</span> <span class="nf">a_method</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span>
  <span class="k">def</span> <span class="nf">another_method</span><span class="p">;</span> <span class="kp">false</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

könnte man erwarten, dass `another_method` *public* ist. Falsch.
`private` gilt bis zum Ende des Blocks, oder bis ein anderer Modifikator
aufgerufen wird. Standardmäßig sind Methoden *public*\:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">MyClass</span>
  <span class="c1"># Jetzt ist a_method "public".</span>
  <span class="k">def</span> <span class="nf">a_method</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span>

  <span class="kp">private</span>

  <span class="c1"># another_method ist "private".</span>
  <span class="k">def</span> <span class="nf">another_method</span><span class="p">;</span> <span class="kp">false</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

 `public`, `private` und `protected` sind in Wirklichkeit Methoden und akzeptieren Parameter. Wenn du ein Symbol an eine davon übergibst, wird die Sichtbarkeit der Methode mit diesem Namen geändert:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">MyClass</span>
  <span class="c1"># Jetzt ist a_method wieder "private".</span>
  <span class="kp">private</span> <span class="ss">:a_method</span>
<span class="k">end</span></code></pre></figure>

### Sichtbarkeit von Methoden

In Java bedeutet *public*, dass jeder eine Methode aufrufen darf.
*protected* bedeutet, dass nur die Klasse selbst, ihre Instanzen und von
ihr abgeleitete Klassen und deren Instanzen Zugriff haben. *private*
beschränkt den Zugriff ganz auf die Klasse und ihre Instanzen.

Ruby verhält sich anders. *public* ist natürlich öffentlich. *private*
bedeutet, dass die Methode nicht mit einem expliziten Empfänger
aufgerufen werden kann, mit anderen Worten: Der Empfänger ist immer
`self`.

Bei *protected* muss man aufpassen: Eine so geschützte Methode kann ohne
Empfänger in der Klasse und abgeleiteten Klassen aufgerufen werden (wie
bei *private*), aber zusätzlich auch mit einer anderen Instanz dieser
Klasse als Empfänger.

Ein Beispiel aus den [Ruby Language FAQ][faq]:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Test</span>
  <span class="c1"># standardmäßig "public"</span>
  <span class="k">def</span> <span class="nf">identifier</span>
    <span class="mi">99</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">==</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
    <span class="n">identifier</span> <span class="o">==</span> <span class="n">other</span><span class="p">.</span><span class="nf">identifier</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">=</span> <span class="no">Test</span><span class="p">.</span><span class="nf">new</span>  <span class="c1"># =&gt; #&lt;Test:0x34ab50&gt;</span>
<span class="n">t2</span> <span class="o">=</span> <span class="no">Test</span><span class="p">.</span><span class="nf">new</span>  <span class="c1"># =&gt; #&lt;Test:0x342784&gt;</span>
<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>       <span class="c1"># =&gt; true</span>

<span class="c1"># `identifier' ist jetzt "protected"; das funktioniert noch,</span>
<span class="c1"># weil `other' eine Instanz derselben Klasse ist</span>

<span class="k">class</span> <span class="nc">Test</span>
  <span class="kp">protected</span> <span class="ss">:identifier</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>  <span class="c1"># =&gt; true</span>

<span class="c1"># nun ist `identifier' "private"</span>

<span class="k">class</span> <span class="nc">Test</span>
  <span class="kp">private</span> <span class="ss">:identifier</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>
<span class="c1"># NoMethodError: private method `identifier' called for #&lt;Test:0x342784&gt;</span></code></pre></figure>

### Offene Klassen

Ruby-Klassen sind offen. Du kannst sie jeder Zeit verändern und ihnen
Methoden hinzufügen. Sogar eingebaute Klassen wie `Integer` oder `Object`
(die Mutter aller Objekte) sind erweiterbar. ActiveSupport fügt `Integer`
viele Methoden zur Erzeugung von Zeitangaben hinzu:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Integer</span>
  <span class="k">def</span> <span class="nf">hours</span>
    <span class="nb">self</span> <span class="o">*</span> <span class="mi">3600</span>  <span class="c1"># Anzahl der Sekunden in einer Stunde</span>
  <span class="k">end</span>
  <span class="k">alias</span> <span class="n">hour</span> <span class="n">hours</span>
<span class="k">end</span>

<span class="c1"># 14 Stunden nach 00:00 am 1. Januar</span>
<span class="c1"># (oder "als du endlich aufwachst" ;)</span>
<span class="no">Time</span><span class="p">.</span><span class="nf">mktime</span><span class="p">(</span><span class="mi">2006</span><span class="p">,</span> <span class="mo">01</span><span class="p">,</span> <span class="mo">01</span><span class="p">)</span> <span class="o">+</span> <span class="mi">14</span><span class="p">.</span><span class="nf">hours</span>  <span class="c1">#-&gt; Sun Jan 01 14:00:00</span></code></pre></figure>

### Lustige Namen für Methoden

In Ruby dürfen Methoden mit einem Frage- oder Ausrufezeichen enden. Die
Konvention ist, dass Methoden, die auf eine Ja-Nein-Frage antworten, ein
Fragezeichen erhalten: `Array#empty?` liefert `true`, wenn das Array
leer ist. Potentiell gefährliche Methoden (die den Empfänger selbst
verändern wie `String#reverse!`, oder das brutale `exit!`) enden mit
einem Ausrufezeichen.

Aber nicht alle Methoden, die ihre Empfänger verändern, haben ein
Ausrufezeichen. `Array#replace` ersetzt den Inhalt des Arrays mit dem
Inhalt eines anderen. Es macht wenig Sinn, eine derartige Methode zu
schreiben, die den Empfänger *nicht* verändert.

### Singleton-Methoden

Singleton-Methoden sind Methoden für Objekte. Sie gehören nur zu dem
Objekt, für das du sie definierst:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Car</span>
  <span class="k">def</span> <span class="nf">inspect</span>
    <span class="s2">"billig"</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="n">porsche</span> <span class="o">=</span> <span class="no">Car</span><span class="p">.</span><span class="nf">new</span>
<span class="n">porsche</span><span class="p">.</span><span class="nf">inspect</span>  <span class="c1">#-&gt; billig</span>

<span class="k">def</span> <span class="nc">porsche</span><span class="o">.</span><span class="nf">inspect</span>
  <span class="s2">"teuer"</span>
<span class="k">end</span>

<span class="n">porsche</span><span class="p">.</span><span class="nf">inspect</span>  <span class="c1">#-&gt; teuer</span>

<span class="c1"># Andere Objekte werden nicht beeinflusst:</span>
<span class="n">car</span> <span class="o">=</span> <span class="no">Car</span><span class="p">.</span><span class="nf">new</span>
<span class="n">car</span><span class="p">.</span><span class="nf">inspect</span>  <span class="c1">#-&gt; billig</span></code></pre></figure>

### Fehlende Methoden

Ruby gibt nicht auf, wenn es zu einem Aufruf keine passende Methode
finden kann. Es ruft stattdessen die Methode `method_missing` auf und
übergibt den Namen der fehlenden Methode und die Argumente.
Standardmäßig erzeugt `method_missing` einen `NameError`, aber du kannst
es umdefinieren, so dass es besser in deine Anwendung passt (was viele
Bibliotheken auch tun.) Hier ist ein Beispiel:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># 'id' ist der Name der aufgerufenen Methode, ein * sammelt</span>
<span class="c1"># alle argumente in einem Array namens 'arguments'.</span>
<span class="k">def</span> <span class="nf">method_missing</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="o">*</span><span class="n">arguments</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"Die Methode </span><span class="si">#{</span><span class="nb">id</span><span class="si">}</span><span class="s2"> wurde nicht gefunden."</span>
  <span class="nb">puts</span> <span class="s2">"Folgende Argumente wurden übergeben: "</span> <span class="o">+</span> <span class="n">arguments</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s2">", "</span><span class="p">)</span>
<span class="k">end</span>

<span class="n">__</span> <span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="mi">10</span>
<span class="c1">#-&gt; Die Methode __ wurde nicht gefunden.</span>
<span class="c1">#-&gt; Folgende Argumente wurden übergeben: a, b, 10</span></code></pre></figure>

Der obige Code gibt nur die Details des Aufrufs aus, aber du kannst die
Botschaft natürlich auch völlig anders behandeln.

### Botschaften senden statt Funktionen aufrufen

Ein Methodenaufruf ist in Ruby in Wirklichkeit eine Botschaft an ein
Objekt:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span>
<span class="c1"># ist dasselbe wie</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">+</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># ist dasselbe wie</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">send</span> <span class="s2">"+"</span><span class="p">,</span> <span class="mi">2</span></code></pre></figure>

### Blöcke sind Objekte, sie wissen es nur noch nicht

Blöcke werden überall in der Standardbibliothek benutzt. Um einen Block
aufzurufen, kannst du `yield` benutzen, oder du machst eine
`Proc`-Instanz daraus, indem du einen speziellen Parameter zur Signatur
hinzufügst:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">block</span><span class="p">(</span><span class="o">&amp;</span><span class="n">the_block</span><span class="p">)</span>
  <span class="c1"># der Block, der an die Methode übergeben wurde</span>
  <span class="n">the_block</span>  <span class="c1"># Gib den Block zurück.</span>
<span class="k">end</span>
<span class="n">adder</span> <span class="o">=</span> <span class="n">block</span> <span class="p">{</span> <span class="o">|</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">|</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="p">}</span>
<span class="c1"># adder ist jetzt ein Proc</span>
<span class="n">adder</span><span class="p">.</span><span class="nf">class</span>  <span class="c1">#-&gt; Proc</span></code></pre></figure>

Du kannst Blockobjekte auch außerhalb von Methodenaufrufen erzeugen,
indem du `Proc.new` oder die Methode `lambda` mit dem Block aufrufst.

In ähnlicher Weise können auch aus Methoden Objekte gemacht werden:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="nb">method</span><span class="p">(</span><span class="ss">:puts</span><span class="p">).</span><span class="nf">call</span> <span class="s2">"puts ist ein Objekt!"</span>
<span class="c1">#-&gt; puts ist ein Objekt!</span></code></pre></figure>

### Operatoren sind syntaktischer Zucker

Die meisten Operatoren in Ruby sind nur Methodenaufrufe mit einer
speziellen Syntax (und ein paar Vorrangregeln). Du kannst zum Beispiel
die Methode `+` für `Integer` überschreiben:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Integer</span>
  <span class="c1"># Du kannst, aber bitte tu es nicht.</span>
  <span class="k">def</span> <span class="nf">+</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
    <span class="nb">self</span> <span class="o">-</span> <span class="n">other</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

Du brauchst kein `operator+` oder ähnliches.

Du kannst sogar Elementzugriff in der Art eines Arrays ermöglichen, wenn
du die Methoden `[]` und `[]=` definierst. Um das unäre `+` und `-` zu
überschreiben (für Vorzeichen), musst du die Methoden `+@` und `-@`
benutzen.

Die folgenden Operatoren sind *kein* syntaktischer Zucker. Sie sind
keine Methoden, und können nicht umdefiniert werden:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="o">=</span><span class="p">,</span> <span class="o">..</span><span class="p">,</span> <span class="o">...</span><span class="p">,</span> <span class="ow">not</span><span class="p">,</span> <span class="o">&amp;&amp;</span><span class="p">,</span> <span class="ow">and</span><span class="p">,</span> <span class="o">||</span><span class="p">,</span> <span class="ow">or</span><span class="p">,</span> <span class="o">::</span></code></pre></figure>

Zudem sind `+=`, `*=`, usw. nur Abkürzungen für `foo = foo + bar`,
`foo = foo * bar` usw. und können deshalb auch nicht überschrieben werden.

## Weiterlesen

Wenn du bereit für noch mehr Ruby-Wissen bist, dann schau dir die
[Dokumentation](/de/documentation/) an.



[faq]: http://ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html
