def condition_or_block_function
if condition
yield
else
block_function { yield }
end
end
condition_or_block_function do
foo() # which is really a lot of code :)
end
または、他の人が示唆しているように、foo()
一連のコードを実際のメソッドにして、OPに書き込んだ内容を記述します。
@tadmanが示唆するより一般的なバージョン:
def condition_or_block condition, block_method, *args
if condition
yield
else
send(block_method, *args) { yield }
end
end
condition_or_block(some_condition, some_block_yielding_method) do
foo() # which is really a lot of code :)
end
@Christian Oudardは、特定の問題を指定するコメントを追加し、オプションでコードブロックをdiv do...endでErectorで装飾しました。これは別のアプローチを示唆しています:
class BlockWrapper
def initialize(method=nil)
@method = method
end
def decorate
@method ? send(method) { yield } : yield
end
end
wrapper = BlockWrapper.new( condition ? nil : :div )
wrapper.decorate do
#code block
end