【プログラミング学習】Rubyのブロックについて - アウトプットを頑張る

アウトプットを頑張る

初めてのプログラミング学習期間中の記録と、日頃読んでいる本をメモのアウトプットをがんばります。

【プログラミング学習】Rubyのブロックについて

■プログラミング学習 f:id:yuma6128:20211120210756j:plainブロックとは
do~ endまでをRubyではブロックと呼びます。また||の部分で囲んだ部分をブロック変数と言います。

fruits = ["apple","orange","strawberry"]

fruits.each do |fruit|
 puts fruit
end

Rubyに標準で組み込まれているeachメソッドは、ブロックを引数として受け取るメソッドの代表例になります。
eachメソッドは、do ~ endの配列の要素の数だけ処理を繰り返す
ブロックには2種類書き方がある。
1つめは「do ~ end」 2つめは{ }を用いて書き換えたたものです。
{ }の中身は改行しても問題ありません。

# 上の例から 改行なし
fruits.each { |fruit| puts fruit }

# 上の例から 改行あり
fruits.each { |fruit|
puts fruit
}

do ~ end と{ }をどちらを使うか、明確な決まりはありません。
しかし、改行を含む長いコードの場合は、do~ end
1行で収める場合は{}を使うことが多いです。
自分で定義したブロックの使い方
Rubyはtimesメソッドやeachメソッド以外にも、多くのメソッドでブロックが用いられています。
ブロックはRubyで元から定義されているメソッド以外でも利用することができます。

def greeting
 puts "こんにちは"
end

greeting
# ターミナル出力結果
# こんにちは

以下はブロックを追加したものイメージです。

def greeting
 puts "こんにちは"
end

greeting do
 puts "さようなら"
end
# ターミナル出力結果
# こんにちは

ブロックを付けてみても、結果はかわりません。
メソッドに渡したブロックを実行するには、以下のように定義内にyieldを記述が必要です。

def greeting
puts "こんにちは"
yield
end

greeting do
puts "さようなら"
end

# ターミナル出力結果
# こんにちは
# さようなら

yield
yield(イールド)とは、メソッドに渡されたブロックを実行するための命令です。
yieldを使い場面は、高度な開発をするときに限られているため、 最小限の内容でまとめています。
先程の下記コードをもう一度みてみます。

def greeting
puts "こんにちは"
yield
end

greeting do
puts "さようなら"
end

# ターミナル出力結果
# こんにちは
# さようなら

上記コードでは、常に「さようなら」というテキストが出力されてしまいます。
この「さようなら」の部分を任意のものにするために、textという変数にすることができます。
そのためには、メソッドの定義内でyieldに引数を与える必要があります。

def greeting
puts "こんにちは"
yield("さようなら")
end

greeting do |text|
puts text
end

# ターミナル出力結果
# こんにちは
# さようなら

上記コードは、メソッドの定義内でyieldの引数として「さようなら」という文字列を渡しています。
そして、メソッドの実行側でそれをブロック変数(|text|)として受け取っています。

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

def greeting(&block)
puts "こんにちは"
block.call("さようなら")
end

greeting do |text|
 puts text
end

# ターミナル出力結果
# こんにちは
# さようなら

上記コードでは、メソッドの引数としてブロックを明示的に受け取るために、メソッドの定義部分で &blockと書いています。
このように「&引数名」の形でブロックを受け取る引数のことを、ブロック引数と呼びます。
そして、そのブロックを実行するために、callメソッドを実行しています。
callメソッドには、引数を渡すことができます。今回はさようならという文字列をブロックに渡しています。
結果、メソッド呼び出し時に渡しているブロックのブロック変数(|text|)にさようならが代入され、ブロックが実行されています。