Rubyでのバインディングオブジェクトの実際の使用
-
05-07-2019 - |
質問
昨夜、私はルビー言語の高度な機能、つまり継続(callcc)とBindingオブジェクトについて考えていました。私は静的に型付けされたoo言語のバックグラウンド(C#、Java、C ++)があるため、高度なことを意味します。最近ルビーを発見したので、これらの言語機能はあまり馴染みがありません。
これらの言語機能を実際にどのように使用できるのか疑問に思っています。私の経験では、すべてを静的に型付けされたooの言語で行うことができましたが、時々あまり賢くは同意しません。私は、Sam Rubyの素晴らしい記事を読むContinuationの美しさ/興味を理解したと思います。 http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons
それでも、Bindingオブジェクトを失ってしまいました。誰かがBindingオブジェクトでスマートに実行できるものの、Ruby Bindingコンセプトが欠落している言語ではあまりスマートではない何かの実例を提供できますか?
長時間の実行プロセスで何かがうまくいかなくなった場合、いくつかのオブジェクトを初期状態にロールバックすることを考えていましたが、これをBindingオブジェクトで実装できるかどうかはわかりません。処理中に何か問題が発生した場合、変更されたオブジェクトを処理してクローンに置き換えます。したがって、これは私が考える有効な例ではありません。
ご協力いただきありがとうございます。
解決
バインディングクラスを使用してデバッグハックを実装しました。
class Array
def debug binding
each do |arg|
puts "arg = #{eval(arg, binding).inspect}"
end
end
end
これを使用して、Rubyコードのスニペットのリストと各スニペットが返すものを検査できます。
# .. some hairy code you want to debug ...
['user','current_resource', 'user.owns?(current_resource)'].debug(binding)
印刷します
user = #<User id:1, username: 'joe', ...
current_resource = #<Comment id:20, ...
user.owns?(current_resource) = false
クイックデバッグに非常に役立ちます。
debug
が呼び出されるスコープをキャプチャするためにバインディングオブジェクトを使用する必要があったため、 debug
が debug
の場合に eval
走る。これを実装する方法はおそらく他にもありますが、バインディングの使用は簡単で高速でした。また、おそらくどのバインディングオブジェクトが役立つのか、はるかに優れた例もあります...
他のヒント
バインドオブジェクトは、 ERBテンプレートを評価する場合に役立ちます。
http://www.seaside.st/ をご覧ください。これはsmalltalk Webアプリケーションですフレームワーク。継続を広範囲に使用します。使用方法に関する実際の最良の例は、このCMS http://www.cmsbox.com/enです。 / cms