で
詳細情報は、私は、私はちょうど平野ではなく、あなたがより多くの本物のブロックのような内部ブロックを処理してみましょうアプローチを共有したいと思いました古い議論。
これについては、バインディング・コンテキストとして機能し、メソッドとして外部ブロックを定義するオブジェクトを作成することが最善の方法です。 instance_execコールせずに次のように私は
inner_proc = proc { puts "inner" }
outer_proc = proc { |*args, &inner_block|
puts *args
inner_block.call
puts "bar"
}
...元の例を書き換えるのであれば私たちは今、あなたはscope_object.bound_proc
代わりのinstance_exec
コールを呼び出すことができるオブジェクト
scope_object = Object.new
scope_object.define_singleton_method :bound_proc, &outer_proc
の方法としてouter_proc
を定義することができます上記。
scope_object.bound_proc 1, 2, 3, &inner_proc
あなたは得られます。
1
2
3
inner
bar
残念ながら、あなたがLocalJumpErrorを得るでしょうあなたは、むしろinner_block.call
より、outer_proc
の内部で生じるしようとした場合、私はなぜ完全にはよく分かりません。誰かがその答えを持っているなら、私は興味を持っています。
残念ながら、これは私の場合は機能しません。私は、実行時間を追跡できるように、既存のprocを透過的にラップしようとしています。私はprocのシグネチャを制御していないので、私はこのメソッドを使うことができません。一般的には、これは良い回避策のようです。 – Ajedi32