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.
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