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
を付けると便利かもしれない! という話なんですけど,さて…….