Erzeugen wir nun ein Greeter-Objekt und benutzen es:
Wenn g
einmal erzeugt wurde, merkt es sich, dass der Name Patrick ist.
Hmm, und wenn wir direkt auf den Namen im Objekt zugreifen wollen?
Nö, das geht offensichtlich nicht.
Objekten unter die Haube geschaut
Instanzvariablen werden im Inneren des Objekts verborgen. Sie sind nicht so versteckt, dass man sie nicht mehr sieht, wenn man das Objekt untersucht, und es gibt auch andere Wege, auf sie zuzugreifen, aber Ruby benutzt den guten objektorientieren Ansatz der Datenkapselung.
Welche Methoden existieren nun für Greeter-Objekte?
Hoppla, das sind aber ganz schön viele! Wir haben doch nur zwei Methoden
definiert. Was ist hier also los? Es handelt sich hier um alle
Methoden für das Greeter-Objekt – die komplette Liste – inklusive der
Methoden, die von Eltern-Klassen definiert wurden. Wenn wir nur die
Methoden auflisten wollen, die für Greeter definiert wurden, können wir
aber festlegen, dass die Eltern-Klassen nicht berücksichtigt werden
sollen, indem wir false
als Parameter angeben.
Aha, das sieht schon besser aus! Nun schauen wir mal, auf welche Methoden unser Greeter-Objekt reagiert:
Es kennt also sag_hallo
und to_s
. (Die zuletzt genannte Methode ist
jedem Objekt per Voreinstellung bekannt – sie wandelt etwas in einen
String um.) Aber es kennt nicht name
.
Für Klassen-Veränderungen ist es nie zu spät
Aber was, wenn wir es ermöglichen wollen, dass man den Namen ansehen oder ändern kann? Ruby liefert eine einfache Möglichkeit, Zugriff auf die Variablen eines Objekts zu gewähren.
In Ruby kann man eine Klasse jederzeit verändern. Die Änderungen werden
in sämtlichen neu erzeugten Objekten vorhanden sein und darüber hinaus
sogar von bereits existenten Objekten übernommen. Erzeugen wir also ein
neues Objekt und spielen ein bisschen mit dessen @name
-Eigenschaft
herum.
Die Benutzung von attr_accessor
hat zwei neue Methoden für uns
definiert: Mit name
erhält man den Wert, mit name=
setzt man ihn.
Die Begrüßung von allem und jedem – MegaGreeter vernachlässigt niemanden!
Die Greeter-Klasse ist nicht unbedingt interessant, sie kann nur eine Person gleichzeitig behandeln. Was, wenn wir eine Art MegaGreeter hätten, der entweder die ganze Welt, eine Person oder eine Liste von Leuten begrüßen könnte?
Schreiben wir das lieber in eine Textdatei, statt es direkt in den interaktiven Ruby-Interpreter IRB zu tippen.
Um IRB zu beenden, gib “quit” oder “exit” ein, oder drücke einfach Strg-D.
Speichere diese Textdatei als “ri20min.rb” und starte es mit “ruby ri20min.rb”. Die Ausgabe sollte sein:
Hallo, Welt!
Tschuess, Welt, bis bald!
Hallo, Maximilian!
Tschuess, Maximilian, bis bald!
Hallo, Albert!
Hallo, Bianca!
Hallo, Carl-Heinz!
Hallo, David!
Hallo, Engelbert!
Tschuess, Albert, Bianca, Carl-Heinz, David, Engelbert, bis bald!
...
...
In dieses Beispiel wurden einige neue Dinge gestreut, auf die wir sogleich näher eingehen werden.