ruby-mine

exploring the mine

:to_src

von bovi am 10.06.2006 (00 Uhr)

Die meißten von euch kennen bestimmt den Begriff Reflection. Hinter diesem Wort versteckt sich in der Informatik die Möglichkeit, das eigene Programm zur Laufzeit zu inspizieren. Ruby stellt uns hierfür einige Methoden zur Verfügung:

#kennt dieses Objekt die Methode 'length'?
'ich String, du nix'.respond_to?(:length)

#Welche Methoden besitzt dieses Objekt?
%w{ich array , so what ?}.methods

Wie man sieht, kann man schon eine Menge von einem Objekt erfahren. Jedoch bilden diese Informationen nur einen Bruchteil des gesamten Spektrums. Stellt euch vor ihr stellt euch vor einen Spiegel. Auf Anhieb seit ihr natürlich erfreut, dass ihr euer Antlitz erblicken könnt. Wäre es jedoch nicht erstrebenswert, wenn Ihr auch euren knackigen Po optisch erforschen könntet? Hierfür gibt es ja diesen tollen Trick: Man stelle sich vor einen Spiegel und positioniere hinter sich einen weiteren. Nun kann man, wenn man sich ein wenig dreht, teilweise seinen Rücken sehen… Mhhhh… Man kann natürlich auch einen Freund bitten mithilfe der Handykamera ein Bild zu schießen. Dies sollte auch einfacher sein, denn wer hat heutzutage noch einen Spiegel? An dieser Stelle, ergibt sich nun die folgende Behauptung: Wenn wir einfach durch einen zweiten Spiegel eine Introspektion unseres gesamten Körpers durchführen können, müsste dies doch bei Ruby ähnlich einfach funktionieren.

Ich spreche von Code und ich meine Code

Wenn wir ein wenig darüber nachdenken was Introspektion ist, werden wir schnell erkennen, dass das einfachste und auch vollständigste Konzept die Wiedergabe des Quelltextes ist. Dieser beinhaltet sämtliche Strukturinformationen die ein Objekt aufgrund seiner Klassenzugehörigkeit besitzt. Die zur Laufzeit definierten Änderungen ignoriere ich getrost erstmal.

Wir haben also unseren Rubycode:

class MeineKlasse
  def initialize str
    @mein_interner_string
  end

  def meine_wichtigste_methode
    5.times do
      puts 'ich bin so wichtig'
    end
  end
end

Nun wollen wir während der Laufzeit an den Quelltext ran:

puts MeineKlasse.to_src

Zu der NoMethodError Exception sage ich erstmal scheiße. Ruby bietet standardmäßig keine Möglichkeit an, den Quelltext einer Klasse zur Laufzeit abzufragen.

Selbst ist das Kind

Da ich als verwöhntes Einzelkind gewohnt bin alles zu bekommen was ich will, hab ich mich aufgemacht dieses fehlende Glied in der Rubykette zu erschaffen. Rausgekommen ist folgendes:

class MeineKlasse
  def initialize str
    @mein_interner_string
  end

  def meine_wichtigste_methode
    5.times do
      puts 'ich bin so wichtig'
    end
  end
end

require 'quelle'

klassen_src = Quelle.init_current_file :class => :MeineKlasse

puts klassen_src.to_s

Dieser Code erzeugt bei mir die folgende Ausgabe:

class MeineKlasse
  def initialize str
    @mein_interner_string
  end
  
  def meine_wichtigste_methode
    5.times do
      puts 'ich bin so wichtig'
    end
  end
end

Wenn wir nur den Sourcecode einer Methode sehen wollen:

methoden_src = Quelle.init_current_file :class => :MeineKlasse,
  :def => :meine_wichtigste_methode

puts methoden_src.to_s

Ergibt:

def meine_wichtigste_methode
  5.times do
    puts 'ich bin so wichtig'
  end
end

In diesem Sinne:

puts 'Möge der Sourcecode mit euch sein.'

Resultat: Quelle Sourcecode


Kommentar schreiben

Name (notwendig)

Mail (wird nicht veröffentlicht)

Webseite


Kommentare

  1. janfri schrieb am 13.06.2006 (15 Uhr)

    Wenn man das ganze dann noch mit RubyNode (http://rubynode.rubyforge.org) kombiniert, bekommt man sogar Zugriff auf den AST und hat somit sogar die Möglichkeit, den Code nicht nur syntaktisch sondern auch semantisch zu "erforschen".

  2. thopre schrieb am 30.07.2006 (03 Uhr)

    Hm, eine ist ja ganz nett, aber wie kann man so etwas nun nutzbringend verwenden?

  3. Bovi schrieb am 31.07.2006 (00 Uhr)

    Was meinst du mit nutzbringend verwenden? Idee ist natürlich die Inspektion. Wenn ich innerhalb der irb beispielsweise den Sourcecode einer Klasse ändere hätte ich so die Möglichkeit den derzeit aktuellen Quelltext zu begutachten. Jedoch ist die aktuelle Implementierung noch nicht so weit, dass die wirklich produktiv einsetzbar ist. Wenn Interesse daran besteht, meldet euch ruhig. Man kann sicher noch ein wenig rumbasteln.

  4. azuby schrieb am 01.09.2006 (13 Uhr)

    Vielleicht auch ganz interessant: http://blog.zenspider.com/archives/2005/02/rubytoruby.html azuby