0

ブロックを使用してコードを呼び出す必要がある場合は、2つの方法があります。

オプション1:

foo()

オプション2:

block_function do 
  foo()
end

実行時にこれら2つを切り替えるにはどうすればよいですか?foo()実際にはたくさんのコードがあるので、私は本当に次のことをしたくありません:

if condition then
    foo()
else
    block_function do 
      foo()
    end
end
4

1 に答える 1

1
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
于 2012-05-15T18:29:05.767 に答える