ブロックについてのまとめ
Rubyを触り始めて早一年が経ちました。
やっと、ブロックつきメソッドを定義し、実装することができました。
そこで、Rubyのブロックに付いて簡単にまとめたいと思います。
参考
- 作者: 高橋征義,後藤裕蔵,まつもとゆきひろ
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2010/03/31
- メディア: 単行本
- 購入: 15人 クリック: 394回
- この商品を含むブログ (79件) を見る
ブロックとは
- 「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の引数が、ブロック変数へ代入され、ブロックが実行される
使用例
あるメソッドを定義したけど、そのメソッド内の処理を呼び出し元に依存させたい時にブロックを使いました。
使いどころは、まだまだ分かっていませんが、使えるとかなり便利だと感じました。
次はこれで勉強します。
- 作者: Russ Olsen,ラス・オルセン,小林健一,菅野裕,吉野雅人,山岸夢人,小島努
- 出版社/メーカー: ピアソン桐原
- 発売日: 2009/04/01
- メディア: 単行本
- 購入: 13人 クリック: 220回
- この商品を含むブログ (66件) を見る
それでは、Proc.newとかlamdaとかprocに関してはまた今度。
最後までお読みいただきありがとうございました。