Hinein und wieder heraus - Theorie Lektion 4
Die letzte Lektion lehrte dich, was in Ruby eine Methode ist—eine Menge von Codezeilen, denen du einen Namen verpasst. Du rufst die Methode auf, indem du den Namen der Methode verwendest.
Eine Methode ist aber eigentlich noch mehr. Sie ist wie eine Maschine. Das Aufrufen der Methode bei ihrem Namen ist, als wenn du eine Maschine einschaltest. Wenn die Maschine fertig ist, hört sie auf zu arbeiten—die Methode hat alle Codezeilen ausgeführt.

Und wo ist das mehr? Bevor du eine Maschine arbeiten lässt, kannst du normalerweise etwas in die Maschine hineingeben. Ist sie fertig mit ihrer Arbeit, dann liefert sie ein fertiges Produkt. Schau dir die Goldmaschine in der Abbildung an. Sie erhält als Eingabe Goldsteine (Felsbrocken, in denen Gold eingeschlossen ist) und liefert als Ausgabe Goldbarren. Wie sie das genau macht, wissen wir nicht. Irgendwie wird sie die Steine erhitzen, das Gold schmilzt und läuft heraus, wird aufgefangen in Formen gegossen… Egal, Hauptsache sie macht, wozu sie konstruiert wurde.
Oder stell dir eine Kaffeemaschine vor! Es ist Sonntagmorgen und du möchtest Mama, die noch friedlich schläft, mit einem Tässchen Kaffee überraschen. Du gibst folgendes in die Kaffeemaschine hinein:- Ein wenig Wasser
- Einen Kaffeefilter
- Etwas Kaffeepulver
Du schaltest die Maschine ein. Sofern sie korrekt funktioniert, wird sie dir Kaffee zubereiten, der in eine Glaskanne herausläuft. Nun nur noch in eine schöne Sonntagstasse füllen, etwas Sahne dazu, vielleicht Zucker, Untertasse nicht vergessen (Mamas mögen sowas!), auf das Tablett neben das leckere Marmeladebrötchen und das frisch gekochte Ei (das hast du mit einer anderen Maschine erledigt) und ab zu Mama! So kriegst du sie immmer wach, egal wie früh es ist…
Eine Methode ist wie eine Maschine, hatte ich gesagt. Wie gibst du nun etwas in die Methode hinein? Und wie bekommst du etwas aus der Methode heraus? Schauen wir uns an, wie das mit einer Rubymethode aussieht:
# theorie_04.rb
def kaffee_maschine(wasser, filter, pulver)
# Die Maschine beginnt mit dem Heizen des Wassers
puts "=> #{wasser} Wasser werden heisser und heisser..."
puts "=> Pumpe das Wasser durch ein Roehrensystem..."
puts "=> Und lasse es auf #{pulver} Pulver in den #{filter} fallen.\n"
# Das heisse Wasser laeuft durch das Pulver im Filter in die Glaskanne
# darunter, das geht von alleine, da braucht die Maschine nichts
# weiter zu machen
# ...
# Maschine ist fertig:
puts "=> Fauchen und Dampf ablassen als Zeichen, dass ich fertig bin..."
# Fertigen Kaffee zurueckliefern
return "Bitte schön: Glaskanne mit #{wasser} leckerem Kaffee"
end
wasser = "2 Tassen (okay Papa kriegt auch eine)"
filter = "Kaffeefilter Groesse 4 (der aus dem Aldi)"
pulver = "Mhhmm, riecht das lecker. 2 Löffel!"
kaffee_fuer_mama = kaffee_maschine(wasser, filter, pulver)
puts "Kaffee ist fertig!"
puts kaffee_fuer_mama
Schauen wir uns den Code genauer an!
Zunächst definierst du eine Methode mit dem Namen kaffee_maschine. Die Methode umfasst alle Codezeilen bis zum zugehörigen end. Die Methode selbst kocht uns natürlich keinen echten Kaffee, es ist ja nur ein Rubyprogramm. Daher gibt es nur aus, was es tun würde, wenn es eine echte Kaffeemaschine wäre.
Hier ist aber etwas neu. Hinter dem Namen der Methode steht ein Paar runde Klammern, und innerhalb der Klammern stehen drei Variablennamen wasser, filter und pulver. Merke also, wenn du möchtest, dass jemand etwas in deine Methode (Maschine) hineintun können soll, dann schreibst du hinter den Methodennamen in runde Klammern für jedes Ding einen Variablennamen.
Innerhalb der Methode kannst du dann die Variablen wie ganz gewöhnliche Variablen verwenden und irgendetwas damit machen.
Ist die Methode (Maschine) fertig, kann sie das Ergebnis (das fertige Produkt) zurückgeben. Das passiert in der letzten Zeile vor dem Ende der Methode mit dem return Befehlt. Nach dem return steht das, was du deine Methode zurückgeben lassen möchtest. Im Beispiel oben ist es einfach die Mitteilung, dass in der Glaskanne 2 Tassen Kaffee sind.
Noch einige Besonderheiten
Die Variablen, die du hinter dem Methodennamen aufzählst, sind wirklich nur innerhalb der Methode verwendbar. Außerhalb der Methode sind die Variablen nicht bekannt. Wir haben zwar unterhalb der Methode diese 3 Variablen noch einmal stehen, das sind aber komplett andere Variablen, die heißen bloß genauso! Wir könnten sie oder die Variablen hinter dem Methodennamen ganz anders nennen, und das Programm funktionierte noch immer. Bedenke nur, dass du die Variablen dann auch dort ändern musst, wo du sie verwendest.
def kaffee_maschine(wasser, filter, pulver)
# Die Maschine beginnt mit dem Heizen des Wassers
...
return "Bitte schön: Glaskanne mit #{wasser} leckerem Kaffee"
end
wieviel_wasser = "2 Tassen (okay Papa kriegt auch eine)"
welcher_filter = "Kaffeefilter Groesse 4 (der aus dem Aldi)"
wieviel_pulver = "Mhhmm, riecht das lecker. 2 Löffel!"
kaffee_fuer_mama = kaffee_maschine(wieviel_wasser, welcher_filter, wieviel_pulver)
puts "Kaffee ist fertig!"
puts kaffee_fuer_mama
Bei der Rückgabe des Ergebnisses kannst du das Wörtchen return auch weglassen, wenn die Rückgabe in der letzten Zeile der Methode erfolgt. Das muss nicht zwingend immer die letzte Zeile vor dem end sein. Sondern es muss die letzte Zeile sein, die Ruby während der Abarbeitung deiner Methode ausführt, bevor Ruby die Methode verlässt. Hast du beispielsweise eine IF-Abfrage in der Methode, könnte es mit und ohne return so aussehen.
# Methode mit return
def mehr_kaffee(soviel_hatte_sie_schon)
if soviel_hatte_sie_schon > 2
return "gibt nix mehr!"
else
return "Okay, noch eine Tasse!"
end
end
# Methode ohne return
def mehr_kaffee(soviel_hatte_sie_schon)
if soviel_hatte_sie_schon > 2
"gibt nix mehr!"
else
"Okay, noch eine Tasse!"
end
end
Die Zeile, die im letzten Codebeispiel als letztes ausgeführt wird, hängt ab vom Wert, der in der Variablen soviel_hatte_sie_schon übergeben wurde. Ist der Wert größer 2, gibt die Methode “gibt nix mehr!” zurück, auch wenn diese Codezeile nicht die letzte in der Methode ist. Sie ist aber die letzte, die unter diesen Bedingungen von Ruby ausgeführt wird. Denn in den else-Zweig gelangt Ruby nur, wenn der Wert der übergebenen Variablen kleiner oder gleich 2 ist.
Üben mit Peter und Livia
Livia: Schreibe eine Methode mit dem Namen maximum, die zwei Zahlen entgegen nimmt, dann entscheidet, welche Zahl die größere ist und diese dann als Ergebnis zurückliefert.
Peter: Schreibe eine Methode mit dem Namen verketten, die zwei Zeichenketten entgegen nimmt, sie beide aneinander hängt und die so neu entstandene Zeichenkette zurück gibt.
Trackbacks
Verwenden Sie den folgenden Link zur Rückverlinkung von Ihrer eigenen Seite:
http://www.rubykids.de/trackbacks?month=07&year=2007&article_id=hinein-und-heraus&day=22
