DSL Block ohne Argument in Ruby

8

Ich schreibe eine einfache DSL in Ruby. Vor ein paar Wochen bin ich auf einen Blogeintrag gestoßen, der zeigt, wie man Code wie folgt umwandelt:

%Vor%

in Reinigercode:

%Vor%

Ich kann mich nicht erinnern, wie ich das machen soll, und ich bin mir nicht sicher, was die Nachteile angeht, aber eine saubere Syntax ist verlockend. Hat jemand eine Ahnung von dieser Transformation?

    
dhuCerbin 10.02.2012, 09:59
quelle

3 Antworten

9
%Vor%

UPDATE: Das Buch wird jedoch weggelassen, aber Sie können das Argument nicht verwenden. Um es transparent zu verwenden, müssen Sie es irgendwie transportieren. Ich schlage vor, es auf Buch selbst zu machen:

%Vor%     
Sony Santos 10.02.2012, 10:21
quelle
7

Sehen Sie sich diesen Artikel Ссылка an - es gibt ein Überblick über die Methode (speziell im Kontext ihrer Nachteile und mögliche Lösung für sie), plus gibt es mehrere nützliche Links für das weitere Lesen.

Grundsätzlich geht es darum, mit instance_eval den Block im gewünschten Kontext auszuführen.

Über den Nachteil dieser Technik sprechen:

  

Also, was ist das Problem damit? Nun, das Problem ist, dass Blöcke sind   in der Regel Schließungen. Und Sie erwarten, dass sie tatsächlich vollständig geschlossen sind.   Und es ist nicht offensichtlich von dem Punkt, wo Sie den Block schreiben, dass   Dieser Block ist möglicherweise keine vollständige Schließung. Das passiert bei dir   Verwenden Sie instance_eval: Sie setzen das self dieses Blocks in etwas zurück   sonst - das bedeutet, dass der Block immer noch eine Schließung über alle lokalen ist   Variablen außerhalb des Blocks, aber NICHT für Methodenaufrufe. Ich nicht einmal   wissen, ob die ständige Suche geändert wird oder nicht.

     

Mit instance_eval werden die Regeln für die Sprache so geändert, dass   ist beim Lesen eines Blocks nicht offensichtlich. Sie müssen einen zusätzlichen Schritt denken   genau herauszufinden, warum ein Methodenaufruf, den Sie lexikalisch sehen können   um den Block kann eigentlich nicht von innerhalb des Blocks aufgerufen werden.

    
Alexis 10.02.2012 10:41
quelle
0

Sieh dir den gefügigen Edelstein an. Es kümmert sich um alle scharfen Kanten, so dass dies sehr einfach für Sie ist.

    
ms-ati 18.02.2013 16:05
quelle

Tags und Links