質問

昨夜、私はルビー言語の高度な機能、つまり継続(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 走る。これを実装する方法はおそらく他にもありますが、バインディングの使用は簡単で高速でした。また、おそらくどのバインディングオブジェクトが役立つのか、はるかに優れた例もあります...

他のヒント

http://www.seaside.st/ をご覧ください。これはsmalltalk Webアプリケーションですフレームワーク。継続を広範囲に使用します。使用方法に関する実際の最良の例は、このCMS http://www.cmsbox.com/enです。 / cms

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top