Nur basierend auf dem Namen der Methoden, Ich würde erwarten, dass class_eval Sie hinzufügen eine Klassenmethode zu Foo und instance_eval, damit Sie eine Instanzmethode zu Foo hinzufügen können. Aber sie scheinen das Gegenteil zu tun.Wie kann man den Unterschied zwischen class_eval() und instance_eval() verstehen?
Im obigen Beispiel erhalten Sie einen undefinierten Methodenfehler, wenn Sie class_bar auf der Foo-Klasse aufrufen, und wenn Sie instance_bar auf der Instanz von Foo.new aufrufen, erhalten Sie auch einen undefinierten Methodenfehler. Beide Fehler scheinen einem intuitiven Verständnis von class_eval und instance_eval zu widersprechen.
Was ist der Unterschied zwischen diesen Methoden?
Dokumentation für class_eval:
mod.class_eval (string [, Dateiname [, lineno]]) => obj
Wertet die Schnur oder Block im Kontext mod. Dies kann verwendet werden, um Methoden zu einer Klasse hinzuzufügen.
Dokumentation für instance_eval:
obj.instance_eval {| | block} => obj
Wertet eine String Rubin Quellcode enthält, oder den gegebenen Block, im Rahmen des Empfängers (OBJ). Um den Kontext zu setzen, wird die Variable self auf obj gesetzt, während der Code ausgeführt wird, was dem Code Zugriff auf objs Instanzvariablen gibt.
Das ist eine tolle Erklärung. Vielen Dank. Ich folgte dir den ganzen Weg bis zum letzten Absatz, wo du versuchst zu erklären, warum instance_eval Klassenmethoden definiert, wenn sie in einer Klasse aufgerufen werden. Die letzte Zeile ist für mich besonders schwer zu verdauen: "Es ist ein Fehler, sie als Klassenmethode zu bezeichnen, sie ist nur eine Instanzmethode für diese bestimmte Klasseninstanz." Meinst du, dass alle Klassenmethoden nichts anderes sind? –
Ja, genau - das ist alles, was sie sind. Ich werde versuchen, es morgen klarer zu machen. – tomafro
Fantastisch - Ich habe gerade eine neue Frage speziell für dieses Problem hinzugefügt: "Warum definiert instance_eval() eine Klassenmethode, wenn sie in einer Klasse aufgerufen wird?" http://stackoverflow.com/questions/900704/why-does-instanceeval-define-a-class-method-when-called-on-a-class. –