
Ruby ist eine objektorientierte Programmiersprache. Was das bedeutet will ich nicht näher beschreiben. Entweder weiß man das oder man liest auf Wikipedia nach. Nun zurück zu Ruby. Viele Programmiersprachen behaupten sie seien objektorientiert. Tatsächlich, Java, PHP, C++, Visual Basic, sie haben alle Attribute, die die objektorientierte Programmierung ermöglichen: Klassen, Polymorphie, Vererbung, Datenkapselung etc.
Aber nur Ruby (und vielleicht noch Python und ein paar Exoten) ist wirklich hundertprozentig objektorientiert.
Das heißt alles ist ein Objekt: Zeichenketten, Zahlen, reguläre Ausdrücke und sogar nil (Nullwert, "nichts") ist ein Objekt der Klasse NilClass.
Eine weitere wichtige Besonderheit von Ruby ist, dass man auf die Instanzvariablen (Attribute eines Objekts) niemals direkt zugreifen kann, sondern nur über dazugehörige Methoden.
Man kann es schnell ausprobieren und herausfinden zu welcher Klasse zum Beispiel eine Zeichenkette gehört indem man das Tool IRB (Interactive Ruby) startet:


Jeder kann es selbst ausprobieren und man sollte es bei dem Umgang mit Ruby stets im Kopf behalten. Alles ist ein Objekt, Objekte gehören zu Klassen und Variablen sind Zeiger auf diese Objekte.
OK. Weiter geht's mit dem praktischen Teil.
Ich möchte in meinen Tutorials nicht irgend welche (sinn)lose Beispiele bringen, sondern voll auf das "Lehrling-by-Doing" setzen. Das heißt ich werde alle Sprachkonstrukte der Programmiersprache Ruby anhand von kleinen Programmen beschreiben, die sogar vielleicht etwas sinnvolles machen :)
In diesem Tutorial schreiben wir ein kleines Tool, das uns schnell eine Übersicht liefert, welche Wörter am häufigsten in einem Text benutzt werden.
Dabei lernen wir, wie man in Ruby mit den Arrays, Hashes, Schleifen und bedingten Anweisungen umgeht, und wie man die Dateien liest und schreibt.
Los geht's:
- Wie schon im ersten Tutorial erstellt eine neue Datei. Ich nenne die Datei einfach word_frequency.rb
- Öffnet die erstellte Datei, gebt folgendes ein und speichert ab:
# Dieses Programm zeigt die Worthäufigkeiten eines Textes an
frequencies = {}
text = File.read('input.txt')
words = text.downcase.scan(/\w+/)
words.each do |word|
if frequencies.include?(word)
freq = frequencies[word]
else
freq = 0
end
frequencies[word] = freq + 1
end
sorted_frequencies = frequencies.sort{|freq1, freq2| freq2[1] <=> freq1[1]}
File.open('frequencies.txt', 'w') do |file|
sorted_frequencies.each do |word, freq|
file.puts("%s : %d" % [word, freq])
end
end
Nun erstellt im gleichen Verzeichnis eine andere Datei mit dem Namen input.txt und speichert dort irgend einen Text ab. Ich habe den Text meines ersten Ruby Tutorials zum Testen verwendet.
Startet nun das Programm wie folgt:
ruby word_frequency.rbNach dem das Programm beendet wurde, findet ihr im selben Verzeichnis eine neue Datei frequencies.txt mit den berechneten Worthäufigkeiten.
Wie geht das? Nun, Zeile für Zeile:
# Dieses Programm zeigt die Worthäufigkeiten eines Textes anmit # beginnt ein Kommentar, nützlich um später noch eigene Quelltexte zu verstehen ;)frequencies = {}leere Hash-Variable, alternative Schreibweise: frequencies = Hash.new
Array legt man dann ähnlich an: my_array = [] oder my_array = Array.new
text = File.read('input.txt')Inhalt der Datei input.txt auslesen und als text Variable speichern
words = text.downcase.scan(/\w+/)Hier wird erst der Text mit Hilfe der downcase Methode in Kleinbuchstaben konvertiert
und dann mit scan werden alle Wörter im Text als Array zurück gegeben
words.each do |word|für jedes Wort …if frequencies.include?(word)gibt es schon eine Häufigkeit für das aktuelle Wort?freq = frequencies[word]wenn ja, als freq zwischenspeichernelsesonst …freq = 0freq auf 0 setzenfrequencies[word] = freq + 1die neue Häufigkeit für das Wort im Hash speichernendEnde deer each Schleifesorted_frequencies = frequencies.sort{|freq1, freq2| freq2[1] <=> freq1[1]}Wir müssen nun nach Häufigkeiten sortierenHash in Array umwandeln ([[Key1, Value1], [Key2, Value2]...]) und nach Value sortieren
File.open('frequencies.txt', 'w') do |file|Datei frequencies.txt zum Schreiben (w) öffnensorted_frequencies.each do |word, freq|jedes Wort-Häufigkeit-Paar …file.puts("%s : %d" % [word, freq])in der geöffneten Datei speichern (dabei wird Zeile für Zeile gespeichert und formatiert)endEnde der each SchleifeendDatei schließen, wir sind fertig!Nach der Ausführung habe ich folgendes in meiner frequencies.txt Datei:
ruby : 31
und : 27
die : 21
... usw
ruby auf Platz 1. Logisch, oder? ;)
So sieht es aus! Natürlich kann man das eine oder andere anders schreiben. Zum Beispiel könnte man statt if…else..end einfach frequencies[word] = (frequencies[word] || 0) + 1 machen. Aber besonders am Anfang sollte man so etwas eher vermeiden, finde ich, weil die Lesbarkeit darunter enorm leidet.
Wenn ihr etwas nicht verstehen solltet, keine Sorge, es wird höchstwahrscheinlich in den späteren Tutorials erklärt. Oder stellt einfach eure Fragen in den Kommentaren. Ich versuche sie alle zu beantworten.


Kommentare
Hi, etwas stimmt nicht mit der Textformatierung in diesem Tutorial. Ansonsten hat wieder Spaß gemacht, dein Tutorial zu lesen. Weiter so!
Ich bereite z.Zt. Unterlagen für ein Seminar über "Objektorientierung in Reinkultur" für das WS 2010/11 an der TU Darmstadt vor. Bei der Suche nach "Ruby objektorient*" stieß ich auf diesen Artikel. Mich stört am Anfang das Alleinstellungsmerkmal, nur Ruby sei ("… außer ein paar Exoten") 100% objektorientiert. Im Teil 1 erwähnen Sie zwar Smalltalk, feststellen möchte ich nur, Smalltalk-80 und alle späteren Varianten sind mindestens ebenso 100% objektorientiert, und Smalltalk ist sicher kein Exote.
Univ.-Prof. Dr. Hans-Jürgen Hoffmann,
seit 1984 intensiver Smalltalk-Kenner.
Vielen Dank führ Ihren Kommentar. Sicher ist Smalltalk in seinen Grundsätzen objektorientiert. Aber was seinen Einsatz als Programmiersprache in modernen Anwendungen angeht, ist Smalltalk eher ein Exote. Dabei nehmen Ruby dank Ruby on Rails und Pyhton dank Google immer an Bedeutung zu. Denn moderne Business-Applikationen sind heute ohne WWW unvorstellbar
Nun, da gehen eben unsere Meinungen und Beobachtungen auseinander.
Mit der Seaside-Entwicklung im Smalltalk-Umfeld steht ein sehr
leistungsfähiges Werkzeug für die Entwicklung von Web-Anwendungen
auf den meisten Smalltalk-Plattformen zur Verfügung; und Seaside
wird stark zunehmend eingesetzt.
Ich empfehle noch die Web-Seite www.softguide.de/presse/pm/104.htm,
falls Ihnen diese noch nicht bekannt ist.
Hans-Jürgen Hoffmann
Kommentieren