block_given?/ブロック引数でブロックの有無を判定する

Ruby

Procオブジェクト(ブロック)を利用するメソッド内でブロックの有無を確認する方法には2つあります。ひとつはblock_given?を利用する方法、もうひとつはブロック引数をチェックする方法です。

メソッドにブロックを渡し、渡されたブロックをメソッド内で実行する方法には以下の3つがあります。

  • Procオブジェクトをブロック引数として渡し、メソッド内でブロック引数を利用する方法
  • ブロックをブロック引数として渡し、メソッド内でブロック引数を利用する方法
  • yieldを利用してブロックを実行する方法

各方法の詳細解説はProc/yield/&blockによるメソッドへのブロック渡し・実行方法で紹介しています。

今回は上記3パターンにおけるブロックの確認方法について紹介します。

Procオブジェクトをブロック引数として渡し、メソッド内でブロック引数を利用する方法の場合

ブロック引数を確認することでブロックの有無がわかります。

def message(&block)
  if block.present?
    block.call
  else
    "Hi there"
  end
end


### Procオブジェクトを渡せば block.present?はtrue
message_proc = proc {
  "Hey Bob"
}
message(&message_proc)
=> "Hey Bob"

### Procオブジェクトを渡さなければ block.present?はfalse
message
=> "Hi there"

ブロックをブロック引数として渡し、メソッド内でブロック引数を利用する方法の場合

ブロック引数を確認することでブロックの有無がわかります。

def message(&block)
  if block.present?
    block.call
  else
    "Hi there"
  end
end

### ブロックを渡せば block.present?はtrue
message do
  "Hey Bob"
end
=> "Hey Bob"

### ブロックを渡さなければ block.present?はfalse
message
=> "Hi there"

yieldを利用してブロックを実行する方法の場合

block_given?を利用することでブロックの有無が確認できます。

def message
  if block_given?
    yield
  else
    "Hi there"
  end
end

### ブロックを渡せば block_given?はtrue
message do
  "Hey Bob"
end
=> "Hey Bob"

### ブロックを渡さなければ block_given?はfalse
message
=> "Hi there"

さいごに

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!

参考