1
0

More than 3 years have passed since last update.

【Ruby】ブロックの書き方

Last updated at Posted at 2020-12-25

概要

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メソッドを使う。

参考文献

1
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0