概要
Rubyの理解を深めるためにブロックについて学習をしたのでアウトプットしていきます。
ブロックとは
-
do〜end
のことをRubyではブロックと呼ぶ。 -
|i|
の i はブロック引数ブロックパラメーターと呼ぶ。
例題があったほうが理解しやすいのでたとえばこのような問題。(他に解き方はありますが今回はtimes文
)
ブロックとはtimes
メソッドの引数のことです。ブロックの内容で繰り返し処理を行うようにdo〜end
に書くことで繰り返しています。
【問題】
1〜10までの数値を順番に足し合わせて、最後に全て足した結果をターミナルに出力する
sum = 0
10.times do |i|
sum += i + 1
end
puts sum
# ターミナル出力結果
# 55
ブロックの書き方
上の問題ではdo〜end
を使いました。他にもブロックの書き方はあります。
たとえばこのようになります。
sum = 0
10.times { |i| sum += i + 1 }
puts sum
# ターミナル出力結果
# 55
do〜end
のところを{}
で囲うことでRubyはブロックだと認識してくれます。
書き方は人それぞれですが、こういう書き方があるのだなということを頭に入れておきます。
1行で収められる場合は{}
、改行を含む長いコードの場合はdo〜end
が用いられるようです。
yield
通常のメソッドを呼び出し出力するプログラム
normal
メソッドを呼び出し、putsで出力しています。
## 普通の呼び出し方
def normal
puts 'nomalメソッド呼び出し'
end
normal
# ターミナル出力結果
# nomalメソッド呼び出し
yieldをつかってブロックを実行
nomalメソッドに渡したブロック(do~end)を呼び出しをしています。
## nomalメソッド呼び出し時に渡したブロックをyieldで呼び出し
def normal
puts 'nomalメソッド呼び出し'
yield
end
normal do
puts 'yieldで呼び出し'
end
# ターミナル出力結果
# nomalメソッド呼び出し
#yieldで呼び出し
応用
yieldに引数をつける
ブロックを呼び出す時にyield
に引数を入れることでブロックに任意のもの(引数の値)を渡しています。
def normal
puts 'nomalメソッド呼び出し'
yield('引数を付与')
end
# yieldに引数をつけることでブロックに引数を渡している
normal do |text|
puts text
end
# ターミナル出力結果
# nomalメソッド呼び出し
# 引数を付与
明示的に記述
ポイント
- nomal(&ブロック引数)
- ブロック引数.call(ブロックに渡したい引数)
def normal(&block) # 引数blockに&をつける
puts "nomalメソッド呼び出し"
block.call("引数を付与") # callメソッドでブロック(block)を実行
end
normal do |text|
puts text
end
まとめ
- ブロックには「 do~end 」と「 {} 」がある。
- 「 {} 」を使うことでスッキリ書くことができる。
- 一行で収まるときは「 {} 」、改行が必要なときは「 do~end 」を使う。
- yieldを使うことでメソッドに渡されたブロックを実行することができる。
ブロックを明示的に実行したいときは引数の前に&をつける。引数として受け取ったブロックは「callメソッド」で呼び出すことができる。- ブロックをProcオブジェクトとして受け取るためには引数の前に&をつける。
- ブロックを受け取って実行するにはcallメソッドを使う。