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?
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%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.