Rubyで(ブロック付きのメソッドを)関数合成をするには?
def foo; puts 'foo'; yield; end def bar; puts 'bar'; yield; end def baz; puts 'baz'; yield; end def hoge foo do bar do baz do puts 'yeah!' end end end end
ということをしたいときにhogeの定義の中でfoo doなどを書かずに済む方法が知りたい.1.9 ならさっくりできるんだろーか.
[:foo, :bar, :baz].reverse.each do |block| # ... end
程度の見易さでできればなあ.関数合成できるのが一番スマートな気はしないでもないけど…….
ごにょごにょ.
def foo_bar_baz(&block)
a = []
[:foo, :bar, :baz].each do |f|
a.push proc{ method(f).call &a.shift }
end
a.push block
a.shift.call
end
foo_bar_baz { puts "YEAR!" }
#=> "foo!\nbar!\nbaz!\nYEAR!\n"
あからさまに遅いような気はするけど,まぁこんな感じなのかな…….
なんでこんな話が出てきたかというと,ActiveRecord で条件によっていろいろな with_scope({ :find => {:conditions => "..." }}) do を付けると便利かもしれない! という話なんですけど,さて…….