おそらくこれを行う簡単な方法があるだろう。匿名ブロックへの2つの機能をもたらす。
は私が
def foo(baz)
baz.update_first
bar(baz) {|i| yield i if block_given? }
end
def bar(baz)
if baz.has_condition?
yield baz.val if block_given?
baz.a
else
baz.b
end
end
することを仕事のようなものに
foo(baz) {|b| b.modify}
のように呼ばれ、次の
def foo(baz)
baz.update_first
if baz.has_condition?
yield baz.val if block_given?
baz.a
else
baz.b
end
end
のようなものをリファクタリングしようとしていますか?どうやって?
私はブロック内の降伏がどのように機能するのかを明確に説明していただきたいと思います... proc.cとvm.cとrelevant git commit in the ruby source codeを読むと、barがfooで呼び出されたときに実行されると思います結果が得られるまでフレームスタックを歩き、fooで定義されたブロックのローカル環境ポインタへフレームスタックを歩きます。これは、yieldがブロックfooに向かって歩いて実行され、次に実行されます。あれは正しいですか?これを行うより良い方法はありますか?
これは制御を反転するのと同じように私にはちょっと変わった感じがしますし、fooにはもっと多くのバズについて知ってもらいたいのですが、このコードでprocやlambdaを渡すことはできません。