2015-12-17 7 views

Antwort

4

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.

5

Object#instance_eval ist eine Methode, mit der Sie tatsächlich eine Methode für ein Objekt definieren können.

Singleton-Klasse ist ein "Ort", an dem die für das Objekt definierte Singleton-Methode "lebt".

Das sind also zwei absolut verschiedene Dinge.

+0

Singleton-Klasse ist die Metaklasse dieses Objekts? – mhaseeb

+0

@mhaseeb Absolut richtig. * Singleton-Klasse *, * Eigenklasse *, * Metaklasse * - das sind die verschiedenen Namen einer Sache. –

Verwandte Themen