next up previous contents index
Search Next: =Basisklassen Up: Fortgeschrittene Konzepte Previous: Fortgeschrittene Konzepte   Contents   Index

Dynamisch erstellte Anweisungen

Die Methoden eval, module_eval und instance_eval führen beliebige Zeichenfolgen aus. module_eval läuft im Kontext des angesprochenen Moduls ab und ermöglicht so die Bearbeitung von Methoden. Während der Auswertung des instance_eval übergebenen Strings wird der implizite Empfänger self auf das angesprochene Objekt gesetzt, so dass hier der Zugriff auf private Methoden und Instanzvariablen möglich ist.

class Schueler
  def lerne(name, code)
    eval <<-EOS
      class << self
        def #{name}; #{code}; end
      end
    EOS
  end
end 
anton = Schueler.new
berti = Schueler.new
anton.lerne('singen', 'print "la la la"')
anton.singen  #-> la la la
berti.singen  #-> NameError: undefined method

In der eval-Methode wird dem angesprochenen Objekt eine neue Methode hinzugefügt, andere Objekte der gleichen Klasse merken davon nichts.


\epsfig{height=36pt,file=images/chan.eps}Es kann vorkommen, dass man einem Objekt um ein komplettes Modul erweitern möchte. Die Methode extend macht es möglich:

module Bar
  def to_s; "Bar"; end
end

class A; end

foo = A.new             #-> #<A:...>
foo.extend Bar          #-> Bar
foo                     #-> Bar
\epsfig{height=10pt,file=images/ruby.eps}



(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20