ブロックについてのまとめ

Rubyを触り始めて早一年が経ちました。
やっと、ブロックつきメソッドを定義し、実装することができました。
そこで、Rubyのブロックに付いて簡単にまとめたいと思います。


参考

たのしいRuby 第3版

たのしいRuby 第3版

ブロックとは

  • 「do 〜 end」や「{}」で囲まれた部分のこと
hoge.fuga do ブロック end
hoge.fuga{ブロック}

たとえば、

sum = 0
ary = [1, 2, 3, 4]
ary.each{|i| sum += i}
p sum
# => 10
ブロックつきメソッド
  • ブロックを引数としてとるメソッド
  • 先ほど例で言うとeachがこれにあたる
  • ブロックつきメソッドにブロックを引数として渡して実行することをブロックつき呼び出しという
ブロックつき呼び出し
  • ブロックつき呼び出しの一般系
# *args => 引数の並び
# block_variables => ブロック変数の並び

obj.method(*args) do |block_variables|
  # ブロック
end

obj.method(*args){|block_variables|
  # ブロック
}
  • メソッドの動作時にブロックが実行される

イテレータ

ブロックつき呼び出しの中で、繰り返しを行うためのイテレータについての説明

配列の場合
sum = 0
ary = [1, 2, 3, 4]
ary.each{|i| sum += i}
  • 配列「ary」の一要素がブロック変数「i」に代入され、ブロック「sum += i」が評価させる
ハッシュの場合
sum = 0
hash = {:a => 1, :b => 2, :c => 3, :d => 4}
hash.each{|k, v| sum += v}
  • ハッシュ「hash」のキーとバリューがブロック変数「k」「v」に代入され、ブロック「sum += v」が評価される

ブロックつきメソッドを定義

自分で、ブロックつきメソッドを定義してみる

def hoge
  yield
end

def fuga
  hoge{p "ブロック呼び出し"}
end

fuga
#=> "ブロック呼び出し"
  • yieldに呼び出し元で指定したブロックが渡される
  • つまり、hogeがブロックつきメソッド


ブロック引数がある場合のメソッド

def hoge
  yield "ブロック呼び出し"
end

def fuga
  hoge{|str| p str}
end

fuga
#=> "ブロック呼び出し"
  • yieldの引数が、ブロック変数へ代入され、ブロックが実行される
使用例

あるメソッドを定義したけど、そのメソッド内の処理を呼び出し元に依存させたい時にブロックを使いました。
使いどころは、まだまだ分かっていませんが、使えるとかなり便利だと感じました。


次はこれで勉強します。

Rubyによるデザインパターン

Rubyによるデザインパターン


それでは、Proc.newとかlamdaとかprocに関してはまた今度。


最後までお読みいただきありがとうございました。