Rubyを深掘る

まずは、ブロックを使った簡単なコードを以下に示します。

【例】

ages = [20, 56, 32]

ages.each do |age|
puts age
end

# ターミナル出力結果
# 20
# 56
# 32

上記はeachメソッドで配列の要素を1つずつ取り出してターミナルに出力しています。

見慣れたコードかもしれませんが、実はこのdo〜endまでをRubyではブロックと呼びます。また|age|のageはブロック引数と呼ばれます。

Rubyにおいて、ブロックは頻出の文法なのでまずは用語をしっかり覚えておきましょう。

またブロックをメソッドの引数として渡すことができるのもブロックの特徴です。

例えば、Rubyに標準で組み込まれているeachメソッドは、ブロックを引数として受け取るメソッドの代表例です。

ここまでブロックの基本的な書き方について説明しました。

Rubyには、これまでに学んだtimesメソッドやeachメソッド以外にも多くのメソッドにおいてブロックが用いられています。

では、ブロックはこのようにRubyで元から定義されているメソッドでしか使えないのでしょうか?

そんなことはありません。自分で定義したメソッドでもブロックを使うことができます。

ここでは自分で定義したメソッドでブロックを用いる方法について解説します。

では、はじめに以下のコードを見てください。

【例】

def greeting
puts "Hello"
end

greeting

# ターミナル出力結果
# Hello

解説するまでもありませんね。ただテキストを出力するメソッドを実行しているだけです。

では上記のコードを少し編集します。

【例】def greeting
puts "Hello"
end

greeting do
puts "Goodbye"
end

# ターミナル出力結果
# Hello

greetingメソッドの呼び出し部分に適当なブロックを付けてみました。

実行結果を見てみると、先ほどと変化はありません。

メソッドに渡したブロックを実行するには、以下のようにメソッドの定義内にyieldを記述する必要があります。

【例】

sample.rb
def greeting
puts "Hello"
yield
end

greeting do
puts "Goodbye"
end

# ターミナル出力結果
# Hello
# Goodbye

すると、メソッドに紐付けたブロックの処理が実行されていることが確認できます。

 

ブロックをメソッドの引数として明示的を受け取る方法を知ろう

ブロックをメソッドの引数として明示的に受け取ることもできます。

メソッドの引数としてブロックを明示的に受け取る場合には、引数名の前に&をつけます。また受け取ったブロックを実行する場合は、callメソッドを実行します。

以下を見てください。

【例】

def greeting(&block)
puts "Hello"
block.call("Goodbye")
end

greeting do |text|
puts text
end

# ターミナル出力結果
# Hello
# Goodbye

少し複雑になりましたが、先ほどのコードと上記のコードをじっくり見比べてください。

上記のコードでは、メソッドの引数としてブロックを明示的に受け取るために、メソッドの定義部分で&blockと書いています。

そしてそのブロックを実行するためにcallメソッドを実行しています。

callメソッドには引数を渡すことができます。今回はGoodbyeという文字列をブロックに渡しています。

するとメソッド呼び出し時に渡しているブロックのブロック引数(|text|)にGoodbyeが代入され、ブロックが実行されます。