Alle Ruby-Objekte stellen aufgrund der Abstammung von der
Object-Klasse die Methode methods
zur Verfügung, die sämtliche
verfügbare Methoden eines Objekts ausgibt. Mit dem irb lässt
sich somit schnell eine gesuchte Methode finden. Suchen wir einmal
alle Methoden zur String-Konvertierung. Dazu benutzen wir zusätzlich
die Methode grep
(die auf das Ergebnis der methods
-Methode
angewandt wird):
>> "HSV".methods.grep(/to_/) # alternativ String.methods. ...
=> ["to_a", "to_sym", "to_s", "to_str", "to_i", "to_f"]
Wenn man wissen will, ob ein Objekt eine bestimmte Methode zur Verfügung stellt, kann man eine Anfrage mit
der Methode respond_to?
stellen. So lassen sich Ausnahmen bei der Skript-Interpretation vermeiden und
man kann die Ausführung abhängig machen von der Verfügbarkeit einer Methode, nicht von der Klasse eines Objekts.
Die Untersuchung von Objekten im Hinblick auf ihre Klassen-Beziehungen sollen ebenfalls im folgenden Beispiel verdeutlicht werden:
>> 1.respond_to? ("respond_to?")
=> true
>> 1.id # eindeutige Objekt-ID
=> 3
>> 200_000_000.id
=> 400000001
>> 777.class
=> Fixnum
>> 777.kind_of? Fixnum
=> true
>> 777.instance_of? Fixnum
=> true
>> 777.kind_of? Numeric
=> true
>> 777.instance_of Numeric
=> false
Mit folgendem Skript lässt sich eine die Klassenhierarchie ausgehend von einer übergebenen Klasse (oder einem übergebenen Objekt)
untersuchen. Zusätzlich wird die Methode ancestors
verwendet, die sämtliche Oberklassen und per Mix-in eingebundenen Module
auflistet. Das ganze ist nur möglich, da auch Klassen in Ruby Objekte sind - wie eben "alles"
Das Skript
def untersuche (k)
k=k.class if k.class != Class
p k.ancestors
while k
print k
print " < " if k = k.superclass
end
puts
end
untersuche (1)
puts
untersuche (String)
puts
untersuche (777.77)
... liefert folgendes Ergebnis
[Fixnum, Integer, Precision, Numeric, Comparable, Object, Kernel]
Fixnum < Integer < Numeric < Object
[String, Enumberable, Comparable, Object, Kernel]
String < Object
[Float, Precision, Numeric, Comparable, Object, Kernel]
Float < Numeric < Object
Objekte werden über die
new
-Methoden der Klassen erzeugt (oder natürlich durch die Angabe der Werte, z.B. "hsv" oder [7, 77]). Doch was
passiert, wenn ein Objekt nicht mehr benötigt wird? Die Ruby
Machine beeinhaltet einen Garbage Collector, der den Speicher nicht
mehr benutzter Objekte frei gibt. Der Garbage Collector von Ruby
arbeitet nach dem Mark and Sweep-Algorithmus. Zur näheren
Erläuterung dieses Ansatzes sei auf die Ausarbeitung von Gerold
Veith verwiesen.