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)やってます。フォローしてもらえるとうれしいです!