Ruby on Rails 始めました

Javaやphpはそこそこ書ける程度の人が、Ruby on Railsを一から習得する過程を記したサイト

Rubyの基本文法

Rubyのブロック、ブロック引数、Proc、yieldをまとめてみた

Rubyのブロック、ブロック引数、Proc、yieldっていうJavaには無い機能についてだいたい分かったので、忘備録としてまとめました。

ブロックとは

 Rubyではdo ~ endの一塊(処理の塊)をブロックと言う。
 do ~ endの代わりに{ ~ }を使うことも可能。

 ブロックは、単独では存在できない。

 ↑いきなりこんなことするとエラー。

 ブロックは、一連の処理を関数の引数に渡す為に使う。以下の2文は全く同じで、each関数の引数としてブロックを渡している。

 ブロックの中で| |を書くことでその処理に使う値を受け取っている。

 値を受け取らない場合は、| |は書かなくてもよい。この場合、単に配列の要素の数だけdo処理が繰り返されている。

ブロック引数とは

 上記のように、処理ブロックを丸ごと受け取る引数をブロック引数と言う。

 ブロック引数は普通の引数のように関数の( )の中に入れてはいけない。普通の引数のように「,」で区切って渡すのではなく、他の引数の最後にスペースを空けて付け足す。{ }ブロックを渡す場合はスペースは不要。

 ブロック引数を受け取る関数を定義するには&blockという仮引数を書く。ただしブロック引数は1つしか受け取れない。引数の最後の1つとして書かなければならない。

 block.callで受け取ったブロックを実行する。

 block.callは引数を受け取ることができ、その受け取った引数はブロックに渡される。

 2つの引数 + ブロック引数を受け取る例↓

Procとは

 Procとは、処理の塊をオブジェクト化したもの。処理の塊であるブロックをProcクラスのコンストラクタに渡すことで、Procインスタンスを作ることができる。

 インスタンス化したProc(処理の塊オブジェクト)は、call関数で実行することが出来る。

 引数を受け取る処理の塊も作れる↓

 上述のブロック引数を受け取る宣言として使う&blockと、関数定義部分のblockは、ブロックとProcインスタンスの関係であり、内部的に受け取ったブロックをProcインスタンス化している。
 &はブロックを表す記号であり&blockblockはブロック引数につけた仮引数名にあたるので実は何でも良い。

 つまり引数として受け取ったblockという名のブロックを、blockという名のProcインスタンスに変換しているからblock.callで実行することができる。

 ブロック引数名をbにした場合↓

 ブロック引数受け取るのではなく、Procインスタンスを引数として受け取る書き方もできる。

yieldとは

 しかしながら、そもそもブロック引数を1つしか受け取れないんだったら、ブロック引数に名前を付ける意味なくね?いちいちblock.callなんて無駄にインスタンス名書かせんなよ。ってことで、Procインスタンスの実行部分(block.call)はyieldで置き換えられる。

 引数も同じように受け取れる↓

 関数定義部分にyieldがあるってことは、ブロック引数を受け取ることを意味するので、そもそも&blockも書かなくてよくね?ってことで、yieldがあれば&blockは省略可能。

 ただし、&blockを省略した場合、定義部分のyieldの有無がブロック引数を受け取るかどうかを決めることになるので、可読性が大幅に落ちる。注意されたし。

参考[Ruby]ブロックやProcの使いどころを理解する – Qiita

コメントを残す




関連記事

Pick Up