Das metaprogramming Werkzeug instance_eval
rechts das Gleiche tut? Definieren einer Methode für eine bestimmte Instanz?
Nr. instance_eval
hat überhaupt nichts mit der Definition von Methoden zu tun. Es wertet einen Block im Kontext des Empfängers aus. Normalerweise sind Blöcke lexikalisch begrenzt, einschließlich self
, ein Block, der unter Verwendung von instance_eval
ausgewertet wird, wird mit self
gebunden an den Empfänger der Nachricht ausgewertet.
one = Object.new
two = Object.new
def one.my_eval; yield end
instance_variables
# => []
one.my_eval { @ivar_one = 1 }
one.instance_variables
# => []
instance_variables
# => [:@ivar_one]
two.instance_eval { @ivar_two = 2 }
two.instance_variables
# => [:@ivar_two]
Also, was ist wirklich der Unterschied?
Sie sind völlig unabhängig voneinander. Es macht keinen Sinn, nach dem Unterschied zwischen zwei nicht verwandten Dingen zu fragen.
Singleton-Klasse ist die Metaklasse dieses Objekts? – mhaseeb
@mhaseeb Absolut richtig. * Singleton-Klasse *, * Eigenklasse *, * Metaklasse * - das sind die verschiedenen Namen einer Sache. –