可能有一個簡單的方法來做到這一點。屈服於一個匿名塊兩個函數向上
我試圖重構像下面
def foo(baz)
baz.update_first
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
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
請問這項工作?怎麼樣?
我認爲它會,但我會很欣賞一個塊如何產生的清晰解釋工作...閱讀通過proc.c和vm.c和relevant git commit in the ruby source code,我認爲當在foo中調用bar時,它會執行直到它產生,然後你將幀堆棧移動到foo中定義的塊的本地環境指針,該塊被調用,其中yield返回到foo調用的塊,執行它,然後返回到bar 。那是對的嗎?有一個更好的方法嗎?
對我來說,這感覺有點奇怪,就像反轉控制一樣,它需要foo才能更多地瞭解baz,但不幸的是,我不能簡單地在這段代碼中傳遞一個proc或lambda。