Die beste Art, eine Programmiersprache zu lernen,
ist, damit zu spielen und eigene Ideen auszuprobieren.
Ruby bietet hierfür verschiedene Möglichkeiten, die
wir in diesem Kapitel aufzeigen.
Die einfachen Installationsprozeduren sind in Anhang
E beschrieben.
ist ein bekanntes Problem in der Zahlentheorie.
Man beginnt mit einer positiven ganzen Zahl
.
Ist sie gerade, wird sie halbiert, anderfalls geht das
Spiel mit
weiter.
Es wird vermutet, dass man von jeder Zahl aus
irgendwann immer auf
kommt.
Beginnt man zum Beispiel mit 3, so ist man nach sieben Schritten
bei der 1 angekommen: 3->10->5->16->8->4->2->1.
Erstellen wir nun mit einem Texteditor
die Datei dreiN.rb. Ruby-Dateien enden normalerweise mit .rb.
def naechsteZahl(n)
if n % 2 == 0 then n / 2
else 3 * n + 1
end
end
def zaehle(n)
its = 0
while n != 1
n = naechsteZahl(n)
its += 1
end
its
end
p zaehle(5) #-> 5
p zaehle(137) #-> 90
Wir haben mit def die beiden Funktionen
naechsteZahl und zaehle definiert.
zaehle stellt fest, wie oft naechsteZahl aufgerufen werden
muss, bis das Resultat
ist.
Schließlich probieren wir zaehle noch mit
und
aus.
Mit #-> folgen wir der für Ruby üblichen Konvention,
Ergebnisse als Kommentar anzuzeigen. Der Ruby-Interpreter ignoriert die dem
# folgenden Zeichen bis zum Zeilenende. Längere Kommentare können
mit =begin und =end eingeschlossen werden.
Um ein Ruby-Skript ablaufen zu lassen, gibt es verschiedene Möglichkeiten:
>ruby dreiN.rb 5 90Das
> ist die Eingabeaufforderung an der Konsole
und wird nicht mit eingegeben.
dreiN.rb an der Konsole bzw. ein Doppelklick auf das Datei-Icon
im Explorer ausreicht.
#!/usr/local/bin/ruby
oder auch
#!/usr/bin/env rubyDa Ruby gelegentlich auch unter /usr/bin/ruby zu finden ist, ist die zweite Methode etwas portabler. Wird die Datei noch mit
chmod +x dreiN.rb ausführbar
gemacht, reicht hier ebenfalls die Angabe des Skriptnamens
zur Ausführung.
Besonders praktisch ist, dass irb die Ergebnisse der einzelnen ausgewerteten Ausdrücke anzeigt (ähnlich einem Lisp-Listener), auch wenn kein expliziter Ausgabebefehl angegeben ist. Damit kann irb in einfachen Fällen als bequemer Debugger eingesetzt werden.
> irb irb(main):001:0> def naechsteZahl(n) irb(main):002:1> if n % 2 == 0 then irb(main):003:2* n / 2 irb(main):004:2> else irb(main):005:2* 3 * n + 1 irb(main):006:2> end irb(main):007:1> end nil # Rückgabewert von def irb(main):008:0> irb(main):009:0* def zaehle(n) irb(main):010:1> its = 0 irb(main):011:1> while n != 1 irb(main):012:2> n = naechsteZahl(n) irb(main):013:2> its += 1 irb(main):014:2> end irb(main):015:1> its irb(main):016:1> end nil # Rückgabewert von def irb(main):017:0> irb(main):018:0* p zaehle(5) 5 # Ausgabe nil # Rückgabewert von p irb(main):019:0> zaehle(137) 90 # Rückgabewert von zaehle irb(main):020:0>
Eine ausführliche Beschreibung der Möglichkeiten von irb findet man im Appendix B von [ThHu01] oder online unter [PickAxe].