Objekte

Objekte untersuchen

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

Klassen-Objekte untersuchen

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

Garbage Collection

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.