かまたま日記3

プログラミングメイン、たまに日常

メソッドの引数にメソッドの返り値を渡す場合、blockの渡し方に注意する

たとえば、 こんなメソッドがあるとします。

def foo(arg)
  puts "#{arg}, #{block_given?}"
end

def var
  if block_given?
    yield
  else
    'no block'
  end
end

下記のようにブロックの渡し方でfooメソッド側のblockとなったりvarメソッド側になったりします。想定した渡し方になってない場合があるので注意です。

foo var do
  'block'
end
# => no block, true

foo var {
  'block'
}
# => block, false

foo(var do
  'block'
end)
# => block, false