Reale Welt Verwendung von Bindungs Objekten in Ruby
-
05-07-2019 - |
Frage
Letzte Nacht, ich habe darüber nachgedacht, was ich denke, sind erweiterte Rubin Sprachfunktionen, nämlich Fortsetzungen (callcc) und Binding-Objekte. Ich meine fortgeschritten, weil ich eine statisch typisierte oo haben langages Hintergrund (C #, Java, C ++), I Rubin entdeckte vor kurzem, so dass diese Sprache Funktionen sind nicht sehr vertraut mir.
Ich frage mich, was die reale Welt Verwendung dieser langages Funktionen sein könnte. Nach meiner Erfahrung konnte, alles mit statisch typisierte oo langages getan werden, aber ich stimme manchmal nicht sehr intelligent. Ich glaube, ich herausgefunden, die Schönheit / Interesse der Fortsetzung zu lesen, dass schöner Artikel von Sam Ruby: http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons
Trotzdem bin ich mit Binding-Objekt verloren. Kann mir jemand Beispiele für etwas mit einigen realen Welt schaffen, das Objekt mit Bindung intelligent gemacht werden kann, aber nicht sehr elegant mit langages den Rubin Bindung Konzept fehlt?
Ich dachte an einige Objekte in ihren Ausgangszustand rollbacking, wenn etwas während eines langen runing Prozesses schief geht, aber ich bin nicht sicher, ob dies mit Binding-Objekt implementiert werden könnte und ich denke, ziemlich intelligent umgesetzt werden könnte, indem Sie Objekte vor dem Klonen Verarbeitung und ersetzen modifizierte Objekt mit ihrem Klonen, wenn etwas bei der Verarbeitung schief geht. Das ist also kein gültiges Beispiel denke ich.
Vielen Dank im Voraus für Ihre Hilfe.
Lösung
Ich habe die Binding-Klasse verwendet, um einen Debug-Hack zu implementieren.
class Array
def debug binding
each do |arg|
puts "arg = #{eval(arg, binding).inspect}"
end
end
end
Sie können diese verwenden, um eine Liste der Schnipsel von Ruby-Code zu untersuchen zusammen mit dem, was jeder kehrt Snippet:
# .. some hairy code you want to debug ...
['user','current_resource', 'user.owns?(current_resource)'].debug(binding)
, welche druckt
user = #<User id:1, username: 'joe', ...
current_resource = #<Comment id:20, ...
user.owns?(current_resource) = false
Ich finde es sehr nützlich für eine schnelle Fehlersuche.
Ich brauchte ein Bindungsobjekt zu verwenden, um den Umfang zu erfassen, wo debug
genannt wird, so kann es in der eval
verwendet werden, wenn debug
ausgeführt wird. Es gibt wahrscheinlich andere Möglichkeiten, aber mit der Bindung war einfach und schnell umgesetzt, dies zu haben. Darüber hinaus gibt es wahrscheinlich viel besser Beispiele dafür, was Bindung Objekte sind nützlich für die ...
Andere Tipps
Binding-Objekte sind nützlich, wenn Sie ERB Vorlagen auswerten möchten.
Hier finden Sie aktuelle http://www.seaside.st/ , es ist eine Web-Anwendung smalltalk Rahmen. Es nutzt Fortsetzungen ausgiebig. Bestes Beispiel aus der Praxis, wie man es verwenden, ist dies CMS http://www.cmsbox.com/en / cms