Was machen wir, wenn wir ganz oft “Hallo” sagen wollen, ohne uns die
Finger wund zu tippen? Wir definieren eine Methode!

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):010:0&gt;</span><span class="w"> </span><span class="k">def</span> <span class="nf">hi</span>
<span class="gp">irb(main):011:1&gt;</span><span class="w">   </span><span class="nb">puts</span> <span class="s2">"Hallo, Welt!"</span>
<span class="gp">irb(main):012:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="ss">:hi</span></code></pre></figure>

Mit dem Code `def hi` beginnt man die Methodendefinition. Er teilt Ruby
mit, dass wir eine Methode definieren, deren Name `hi` ist. Die nächste
Zeile nennt man Rumpf (“Body”) der Methode. Sie ist identisch zu der
Zeile, die wir schon von vorhin kennen: `puts "Hallo, Welt!"`. Und
schließlich teilt die letzte Zeile `end` Ruby mit, dass wir fertig mit
der Methodendefinition sind. Rubys Antwort `=> :hi` sagt uns, dass Ruby
das nun weiß.

## Die kurzen, immer wiederkehrenden Lebenszyklen einer Methode

Rufen wir nun die Methode ein paar Mal auf:

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):013:0&gt;</span><span class="w"> </span><span class="n">hi</span>
<span class="go">Hallo, Welt!
</span><span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):014:0&gt;</span><span class="w"> </span><span class="n">hi</span><span class="p">()</span>
<span class="go">Hallo, Welt!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

So einfach ist das also! Man ruft eine Methode auf, indem man Ruby
einfach ihren Namen nennt. Wenn die Methode keine Parameter hat, ist das
alles, was man machen muß. Wenn man will, kann man noch ein leeres
Klammer-Paar ans Ende des Methodennamens setzen, aber das ist nicht
notwendig.

Was, wenn wir nun Hallo zu einer ganz bestimmten Person statt zur ganzen
Welt sagen möchten? Dann definieren wir `hi` einfach neu, so dass ein
Name als Parameter akzeptiert wird:

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):015:0&gt;</span><span class="w"> </span><span class="k">def</span> <span class="nf">hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
<span class="gp">irb(main):016:1&gt;</span><span class="w">   </span><span class="nb">puts</span> <span class="s2">"Hallo, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">!"</span>
<span class="gp">irb(main):017:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="ss">:hi</span>
<span class="gp">irb(main):018:0&gt;</span><span class="w"> </span><span class="n">hi</span><span class="p">(</span><span class="s2">"Matz"</span><span class="p">)</span>
<span class="go">Hallo, Matz!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

Es funktioniert also … aber sehen wir uns genauer an, was hier vor sich
geht.

## Platzhalter in Zeichenketten

Mit dem Platzhalter `#{name}` fügt man in Ruby etwas in eine
Zeichenkette (“String”) ein. Die Variable `name` selbst wird zuerst in
einen String umgewandelt (falls sie nicht bereits eine ist) und dann an
der entsprechenden Stelle innerhalb der Zeichenkette eingefügt. Das kann
man auch dazu benutzen, um sicherzugehen, dass der Name einer Person mit
einem Großbuchstaben anfängt:

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):019:0&gt;</span><span class="w"> </span><span class="k">def</span> <span class="nf">hi</span><span class="p">(</span><span class="nb">name</span> <span class="o">=</span> <span class="s2">"Welt"</span><span class="p">)</span>
<span class="gp">irb(main):020:1&gt;</span><span class="w">   </span><span class="nb">puts</span> <span class="s2">"Hallo, </span><span class="si">#{</span><span class="nb">name</span><span class="p">.</span><span class="nf">capitalize</span><span class="si">}</span><span class="s2">!"</span>
<span class="gp">irb(main):021:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="ss">:hi</span>
<span class="gp">irb(main):022:0&gt;</span><span class="w"> </span><span class="n">hi</span> <span class="s2">"chris"</span>
<span class="go">Hallo, Chris!
</span><span class="p">=&gt;</span> <span class="kp">nil</span>
<span class="gp">irb(main):023:0&gt;</span><span class="w"> </span><span class="n">hi</span>
<span class="go">Hallo, Welt!
</span><span class="p">=&gt;</span> <span class="kp">nil</span></code></pre></figure>

Hier kann man noch weitere Tricks beobachten. Einer davon ist, dass wir
die Methode wieder ohne Klammern aufrufen. Wenn es also offensichtlich
ist, was man machen will, kann man die Klammern ruhig weglassen. Der
andere Trick ist der voreingestellte Parameter (“default parameter”)
`Welt`. Was das bedeutet, ist: “Wenn kein Name als Parameter
mitgeliefert wird, benutze `'Welt'` als Namen”.

## Ein simples Hallo entwickelt sich zu einer richtigen Begrüßung

Du möchtest eine richtige Begrüßung? Etwas, das sich an Deinen Namen
erinnert, Dich willkommenheißt und Dich immer mit Respekt behandelt?
Dafür erzeugen wir am besten ein Objekt. Lass uns also eine Klasse
“Greeter” (“Begrüßer”) schreiben!

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):024:0&gt;</span><span class="w"> </span><span class="k">class</span> <span class="nc">Greeter</span>
<span class="gp">irb(main):025:1&gt;</span><span class="w">   </span><span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="nb">name</span> <span class="o">=</span> <span class="s2">"Welt"</span><span class="p">)</span>
<span class="gp">irb(main):026:2&gt;</span><span class="w">     </span><span class="vi">@name</span> <span class="o">=</span> <span class="nb">name</span>
<span class="gp">irb(main):027:2&gt;</span><span class="w">   </span><span class="k">end</span>
<span class="gp">irb(main):028:1&gt;</span><span class="w">   </span><span class="k">def</span> <span class="nf">sag_hallo</span>
<span class="gp">irb(main):029:2&gt;</span><span class="w">     </span><span class="nb">puts</span> <span class="s2">"Hallo, </span><span class="si">#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2">!"</span>
<span class="gp">irb(main):030:2&gt;</span><span class="w">   </span><span class="k">end</span>
<span class="gp">irb(main):031:1&gt;</span><span class="w">   </span><span class="k">def</span> <span class="nf">sag_tschuess</span>
<span class="gp">irb(main):032:2&gt;</span><span class="w">     </span><span class="nb">puts</span> <span class="s2">"Tschuess, </span><span class="si">#{</span><span class="vi">@name</span><span class="si">}</span><span class="s2">, bis bald!"</span>
<span class="gp">irb(main):033:2&gt;</span><span class="w">   </span><span class="k">end</span>
<span class="gp">irb(main):034:1&gt;</span><span class="w"> </span><span class="k">end</span>
<span class="p">=&gt;</span> <span class="ss">:sag_tschuess</span></code></pre></figure>

Das neue Schlüsselwort hier ist `class`. Damit definieren wir eine neue
Klasse namens “Greeter” und eine gewisse Anzahl von Methoden für diese
Klasse. Beachte auch `@name`! Das ist eine Instanzvariable, die allen
Methoden der Klasse zur Verfügung steht. Wie Du sehen kannst, wird sie
von `sag_hallo` und `sag_tschuess` benutzt.

Wie setzen wir diese Begrüßungsklasse also in Bewegung? Ganz einfach:
[Wir erzeugen ein Objekt!](../3/)
