x

Einloggen

Hast du noch keinen Account? Jetzt registrieren!

Ruby Tutorial Teil 2

Fortsetzung. Hier geht's zum ersten Teil.

Ruby Tutorial Teil 2

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:
Ruby Tutorial Teil 2

Ruby Tutorial Teil 2

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.rb


Nach 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 an
mit # 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 zwischenspeichern

else
sonst …

freq = 0
freq auf 0 setzen

frequencies[word] = freq + 1
die neue Häufigkeit für das Wort im Hash speichern

end
Ende deer each Schleife

sorted_frequencies = frequencies.sort{|freq1, freq2| freq2[1] <=> freq1[1]}
Wir müssen nun nach Häufigkeiten sortieren
Hash in Array umwandeln ([[Key1, Value1], [Key2, Value2]...]) und nach Value sortieren

File.open('frequencies.txt', 'w') do |file|
Datei frequencies.txt zum Schreiben (w) öffnen

sorted_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)

end
Ende der each Schleife

end
Datei 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.
4384 Mal gelesen
+4
30. Jun 2010, 19:46

Kommentare

(4)
RSS
avatar
0
v x
felix 2. Jul 2010, 20:08

Hi, etwas stimmt nicht mit der Textformatierung in diesem Tutorial. Ansonsten hat wieder Spaß gemacht, dein Tutorial zu lesen. Weiter so!

avatar
+2
v x
hoffmann 16. Aug 2010, 18:03

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.

avatar
+1
v x
downtown 17. Aug 2010, 17:59

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

avatar
+1
v x
hoffmann 17. Aug 2010, 18:12

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

Fett Kursiv Unterstrichen Durchgestrichen   Link Zitieren Code
Ich bin mit den Nutzungsbedingungen einverstanden.
Zukünftige Kommentare zu diesem Beitrag abonnieren (abbestellbar).
 
Bitte klicke jetzt auf den Bestätigungslink in deiner E-Mail.