Ich möchte eine Singleton-Methode zu einem bestimmten Objekt hinzufügen. Ich wünsche mir, dass wenn eine Instanzmethode für ein Objekt zuerst aufgerufen wird, sie etwas Arbeit leistet und dann eine Singleton-Methode für das gleichnamige Objekt (das die Arbeit enthält) erstellt. Bei allen nachfolgenden Aufrufen des Objekts würde die Singleton-Methode die Instanzmethode überschatten und würde aufgerufen werden.Ich möchte eine Singleton-Methode mit einer Schließung zu einem Ruby-Objekt
Ich weiß, wie man eine Singleton-Methode erstellen, mein Problem ist, dass ich die Singleton-Methode erstellen möchte, um ein Lambda (l
in diesem Fall) aufzurufen. def erzeugt keine Schließung, daher kann ich die Variable l (Code unten) nicht referenzieren, wenn die Methode anschließend aufgerufen wird (l.call()
ist in diesem Beispiel auskommentiert). Ich möchte wissen, wie ich eine Schließung beim Erstellen einer Singleton-Methode für eine bestimmte erstellen kann Objekt. Jede Hilfe wäre willkommen. Vielen Dank.
class Thing
end
t = Thing.new
t2 = Thing.new
Thing.instance_eval() do
def speak
puts "I speak for all Things, I am a class method"
end
end
Thing.class_eval() do
def speak
puts "This is the instance method referenced by the Thing object #{self}"
r = "something I wish to hold on to, maybe expensive to calculate"
l = lambda {puts r}
instance_eval() do
def speak()
puts "This is the singleton method in the Thing object #{self}"
#l.call() # I want this to work! How?
end
end
end
end
Thing.speak()
t.speak()
t2.speak()
t.speak()
t2.speak()
liefert folgende Ergebnisse bei der Ausführung: (I geändert '<' auf '#', so dass sie in HTML angezeigt)
ich für alle Dinge sprechen, ich bin eine Klasse Methode
Dieseist die Instanz-Methode verwiesen vom Thing Objekt #Thing: 0x1d204>
Dies ist die Instanz-Methode verwiesen durch das Ding Objekt #Thing: 0x1d1dc>
Dies ist die Singleton-Methode im Sache Objekt #Thing: 0x1d204>
Dies ist die Singleton-Methode im Sache Objekt #Thing: 0x1d1dc>
Ja, sehen das Problem scheint, dass define_method zu sein, ist ein Modul/Klasse Modul-Methode. Ich brauche ein define_method ähnliches Ding für irgendein Objekt. Die Methode, die Sie dort definiert haben, definiert eine Instanzmethode für alle Ojekte. Ich suche nach einer Möglichkeit, dynamisch (mit Closures) Methoden für einzelne Objekte zu definieren (Singular), nicht Instanzmethoden für alle Objekte einer bestimmten Klasse. Vielen Dank. –
Nein, es definiert keine Methode für alle Objekte. Es definiert eine Singleton-Methode. Ich habe den Beispielcode aktualisiert, um dies zu veranschaulichen. – Chuck
Ok, ich habe eine Permutation dieses Codes ausprobiert, und es scheint zu funktionieren. Ich muss sagen, ich hätte nie gedacht, dass ich den "class << self; self end" Trick machen würde, das war ziemlich cool. Anywho, das scheint eine funktionierende Lösung für das Problem zu sein, Singleton-Methoden für Ruby-Objekte zu erstellen. Vielen Dank. –