Ruby to_proc Hack mit Bindung

8

Ich versuche, einen kleinen Ruby-Hack zu erstellen, um etwas wie die Rückseite des Symbols # to_proc hack zu machen. Während der Symbol # to_proc Hack das möglich macht:

%Vor%

ist dasselbe wie

%Vor%

Ich möchte das möglich machen:

%Vor%

wäre dasselbe wie

%Vor%

Das Problem ist, dass, außer some_method ist eine Kernel-Methode, was es wirklich bedeuten würde:

%Vor%

Wenn ein Block explizit übergeben wird, wird er innerhalb der Bindung erstellt, in der diese Zeile geschrieben ist, so dass er selbst korrekt auf das aktuelle Objekt zugreift und alles funktioniert. Wenn der Block jedoch in der Methode to_proc des Arrays erstellt wird, befindet sich self innerhalb der Array-Bindung (und bezieht sich auf das Array selbst). Vielleicht ist es nicht möglich zu tun, was ich versuche, aber ich würde einige Ideen aus der Community lieben.

Hier ist mein Hack so weit. Dies funktioniert, solange die Methode eine Kernel-Methode ist und in Array verfügbar ist:

%Vor%

Mit diesem Hack funktioniert diese Zeile und setzt die drei Symbole:

%Vor%

Es ist für mich bereits nützlich, weil ich mich häufig in der Konsole ein Array von ActiveRecord-Objekten ansehen möchte, und es erspart mir die Eingabe von {| i | setzt i}. Aber es wäre noch nützlicher, sie in Objekten verwenden zu können, so dass eine Methode innerhalb des Objekts aufgerufen wird, wobei jedes Element im Array als Parameter übergeben wird.

Also eine Idee, wie man das bindende Problem funktioniert?

Bitte antworten Sie nicht beide mit "Sie wollen das nicht, weil es die Dinge langsamer laufen lässt" oder "Sie speichern nicht so viele Zeichen, aber es macht den Code weniger lesbar" - Ich kenne diese Dinge schon. :) Dies ist eher eine Art, meine Neugier Art von Hack zu füttern. Ich frage mich nur, ob es möglich ist.

    
Allan Grant 29.12.2009, 09:30
quelle

3 Antworten

10

Sie suchen nach der Methode namens method :)

%Vor%

ergibt

%Vor%     
akuhn 29.12.2009, 12:41
quelle
3

Obwohl Adrian mit der Methode method die richtige Idee hat, können Sie dies noch einen Schritt weiter vereinfachen:

%Vor%

Anstatt mit der Einführung von Array # to_proc eine unbeholfene Semantik zu machen, warum schreiben Sie nicht einfach Ihre eigenen Enumerable-Methoden, die Ihnen das Leben erleichtern? Vielleicht in etwa so:

%Vor%     
tadman 29.12.2009 18:18
quelle
1

Hier ist ein anderer Weg, es ohne die Methode method() zu machen :). Er verwendet einen Block, um die Bindung zu erfassen, und ruft dann die entsprechende Methode für self der Bindung auf.

%Vor%     
horseyguy 29.12.2009 12:28
quelle

Tags und Links