Lektion 3 - Wir malen zwei Häuser... 2

Erstellt von Frithjof Sat, 24 Mar 2007 18:11:00 GMT

In Lektion 2 haben wir ein Haus gemalt (d.h. in der DOS-Box ausgegeben). Nun wollen wir mehr als ein Haus ausgeben. Wir wollen eine ganze Reihe mit Häusern ausgeben! Fangen wir aber erst einmal mit 2 Häusern an. Für die DOS-Box Ausgabe haben wir zwei Möglichkeiten: entweder wir geben beide Häuser untereinander, oder nebeneinander aus. Der erste Fall ist einfacher, also fangen wir damit an:


  01 # lektion_03.rb
  02 
  03 require 'rubykids'
  04 
  05 schreibe_leer(2)
  06 schreibe " /^\\ " 
  07 schreibe " |.|  " 
  08 schreibe " |_|  " 
  09 schreibe_leer
  10 
  11 schreibe_leer(2)
  12 schreibe " /^\\ " 
  13 schreibe " |.|  " 
  14 schreibe " |_|  " 
  15 schreibe_leer

Programm ausführen:


C:\entwicklung>ruby lektion_03.rb

Prima es geht!

Wie findest du diese Lösung? Ich finde sie nicht so schön. Stört dich nicht auch, dass du im Programm alles doppelt hingeschrieben hast? Wie soll das Programm aussehen, wenn wir 3 oder 5 oder 500 Häuser ausgeben wollen? Da würde sich ja bald niemand mehr im Programm zurechtfinden (auch Mama nicht)! Wir brauchen eine Möglichkeit, mit der wir die schreibe-Befehle für das Haus nur einmal angeben, Ruby aber dazu bringen, diese Befehle mehrmals auszuführen.

Wiederholungen in Ruby – auch genannt Schleifen

Aus dem Musikunterricht kennst du sicher das Zeichen, das der Komponist verwendet, wenn er möchte, dass der Interpret seines Stückes (derjenige der es singen oder spielen darf) einen Notenabschnitt wiederhollen soll. Ist man beim Wiederholungszeichen :| angelangt, geht man zum unmittelbar vorherigen |: zurück und spielt oder singt den Abschnitt nochmals.

So etwas ähnliches gibt es auch in Ruby:


# lektion_03.rb

require 'rubykids'

2.mal do
  schreibe_leer(2)
  schreibe " /^\\ " 
  schreibe " |.|  " 
  schreibe " |_|  " 
  schreibe_leer
end

Probiere es aus! Das Haus wird nun zweimal ausgegeben – wie zuvor – allerdings mussten wir die schreibe-Befehle und die Zeichenketten für das Haus nur einmal im Rubyprogramm angeben. 6 Zeilen konnten wir wegstreichen und mussten 2 dazu nehmen, insgesamt also ist das Programm um 4 Zeilen kürzer geworden.

Ändere die 2 in eine 4 oder irgendeine beliebige Zahl! Bevor du das nächste mal in Urlaub fährst, kannst du vielleicht die Zahl 30000000 verwenden und nachschauen, ob das Programm nach deinem Urlaub fertig ist!

Ruby kennt aber noch mehrere Möglichkeiten, eine Wiederholung auszudrücken. Wir werden bestimmt noch einige davon in den nächsten Lektionen kennenlernen. Einen Codeabschnitt, der auf diese Art mehrmals durchlaufen wird nennt man auch eine Schleife (englisch loop).

Was ist neu?

Schauen wir uns das 2.mal do … end etwas genauer an. Zuerst schreiben wir eine Zahl hin (die 2), dann einen Punkt und dann den Befehl mal. Was soll das bedeuten? Ruby kennt außer Zeichenketten auch Zahlen. So wie eine Zeichenkette in Ruby String heißt, heißt eine ganze Zahl in Ruby Fixnum oder Integer. Der Punkt nach der Zahl bedeutet, dass wir der Zahl eine Nachricht schicken möchten und zwar soll die Nachricht mal heißen. 2.mal bedeutet also wir schicken an die Zahl 2 die Nachricht mal. Allgemein gesprochen möchten wir, dass die Zahl, an die wir die Nachricht mal schicken, etwas sooft wiederholt, wie sie groß ist. 100.mal do…end bedeutet dann, dass wir 100 mal etwas wiederholen möchten.

Das, was wir wiederholen möchten, fassen wir in einem Codeblock zwischen den Worten do und end zusammen. Ein do leitet immer einen Codeblock ein und ein end schließt ihn wieder ab. Dieser Codeblock ist somit eine Zusatzinformation, die wir zusammen mit der Nachricht mal an die Zahl 2 schicken.

Bei der Nachricht mal entspricht das do somit dem |:, und das end dem :| in der Musik.

Einen kurzen Codeblock können wir auch in eine einzige Zeile schreiben. Um dabei noch mehr Platz zu sparen bietet Ruby die Möglichkeit, das do und end jeweils durch eine öffnende bzw. schließende geschweifte Klammer zu ersetzen. Das ist für unsere deutschen Tastaturen zugegeben nicht gerade eine Erleichterung, aber naja, der Code wird trotzdem etwas übersichtlicher.


# Einzeilige Wiederholung mit geschweiften Klammern

require 'rubykids'

3.mal { schreibe " Hurra, ich kann Ruby!" }

Peter und Livia

Peter: Ich verstehe nicht, warum ich an die Zahl 2 eine Nachricht schicken kann?

Livia: Bei Ruby ist die Zahl 2 nicht nur eine natürliche Zahl, sondern sie ist ein bestimmtes Objekt aus der Klasse Fixnum. Jede Klasse kann bestimmen, auf welche Nachrichten ihre Objekte reagieren und für welche sie taub sind. Landet eine falsche Nachricht im Briefkasten eines Objektes der Klasse, beschwert es sich bei Ruby und Ruby bricht mit einem Fehler ab. Andernfalls schaut sich das Objekt noch an, ob es zur Nachricht eine Zusatzinformation gibt und macht dann etwas damit.

- Änderungen
22.09.2007, Unicodeproblem mit Umlauten