Method#unbind
gibt einen UnboundMethod
Verweis auf die Methode, die später mit UnboundMethod#bind
an ein anderes Objekt gebunden werden kann .
Am Anfang fand ich das unglaublich toll, weil ich erwartet hatte, dass es ähnlich funktioniert wie in% s Function.prototype.call()
/ Function.prototype.apply()
von JavaScript. Das Objekt, an das Sie die Methode binden möchten, muss jedoch derselben Klasse angehören .
Die einzige Anwendung, an die ich denken kann, ist, wenn Sie eine Methode lösen, die ursprüngliche Implementierung verlieren (die Methode in der ursprünglichen oder Singleton-Klasse neu definieren) und dann erneut binden und aufrufen.
Ich fasse die guten Anwendungen zusammen, die ich bisher gefunden habe. Weder verwendet unbind
though.
Zuerst überschreiben Sie eine Methode mit der alten Implementierung. Quelle , dank @WandMaker.
Nehmen wir an, Sie möchten etwas wie folgt machen:
%Vor% Das wird funktionieren, aber old_bar
zurücklassen, was nicht wünschenswert ist. Stattdessen könnte man tun:
Zweitens, indem Sie eine andere Implementierung einer Methode aus der Hierarchie aufrufen. Quelle .
Das sehr praktische Beispiel in der Post war, dass Sie während des Debuggens oft herausfinden wollen, wo eine Methode definiert wurde. Im Allgemeinen können Sie das tun, indem Sie:
%Vor% Dies funktioniert jedoch nicht, wenn die aktuelle Instanz eine Methode method
implementiert, wie dies bei der Fall ist ActionDispatch::Request
. In diesem Fall können Sie Folgendes tun:
Methode und UnboundMethod-Typen erwarten, dass das Bindungsziel eine Unterklasse der ursprünglichen Klasse sein muss, in der Sie auf die Methode verwiesen haben. In der Methode ist jedoch eine #to_proc
-Methode implementiert, und Sie können damit die Einschränkung der "gleichen Klassenart" umgehen.
Sie müssen die Methode #send
verwenden, da #define_method
privat ist (Sie können sie nicht direkt aufrufen).
Tags und Links ruby methods metaprogramming