Was ist der Zweck von Rubys Mechanismus zum Auflösen der Methode?

8

Method#unbind gibt einen UnboundMethod Verweis auf die Methode, die später mit UnboundMethod#bind an ein anderes Objekt gebunden werden kann .

%Vor%

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.

    
ndn 14.11.2015, 12:10
quelle

2 Antworten

2

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:

%Vor%

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:

%Vor%     
ndn 11.02.2016 14:55
quelle
0

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).

%Vor%     
karatedog 15.11.2015 12:16
quelle

Tags und Links