Ruby

yieldとProc(メソッドの引数にブロックを渡す)

0

yieldとProcの理解が難しかったので、「プロを目指す人のためのRuby入門」やQiita記事を参考にして学習したことを復習がてらまとめてみた。
学習を進める上で、過不足がでてきたら、随時更新してブラッシュアップしていきます。

yieldについて

大前提として、押さえておかないことは、メソッドは引数にブロックを取ることができるということ。
でも、引数に長々とブロックの記述なんかしてられない。そこで、登場するのが「yield」
yieldは超簡単に言うと、ブロック(do 〜 end/ { } )の処理のかたまりを置き換えた変数みたいなもの。yieldのおかげで、引数にブロックを取ってもスッキリとしたコーディングになる。

yieldはブロックに引数を渡したり、ブロックの戻り値を受け取ったりすることができる。

ブロックを引数として明示的に受け取る

これまでの書き方だとメソッド内のyieldにたどり着くまでブロックが引数になっているということが分かりにくかったが、ブロックを引数として明示させることができる。

Procについて

Procの基本

Procクラスはブロックをオブジェクト化するためのクラス、つまり、「何らかの処理(手続き)」を表す。
実行したいときはcallメソッドを使って呼び出す。Procオブジェクトの実行方法は4つある。

Procの良いところは、ブロックをオブジェクト化しているので、変数に入れて他のメソッドに渡したり、Procオブジェクトに対してメソッドを呼び出すことができる点にある。

上記の分では、greetingに渡している仮引数に「&」が付いているが、もとのproc変数がProcオブジェクト。よって、ここでは別に「&」でProcオブジェクトに変換する必要がないので、「&」はなくてもOK。
メソッドが引数として受け取れるブロックの数は1つだが、Procオブジェクトはもはやブロックではなく、オブジェクトなので、引数として何個も渡すことができる。

個人的にはProcオブジェクトを生成してから、メソッドに引数として受け渡せば引数の先頭に「&」を書く必要もないし、引数に渡しているオブジェクトの処理も見やすくなるので、こっちの方が好きかも。

Proc.newとlambda

先程、Procオブジェクトの4つの実行方法については記述したが、実は生成方法も4つある。
ラムダ式については、こちらを一つ参考にして理解を深めます。

結局何が違うの?

lambdaはProc.newよりも引数のチェックが厳密になるという違いがある。

クロージャ

Procオブジェクト内で引数やローカル変数を参照すると、メソッドの実行が完了した後でもProcオブジェクトは引き続き、引数やローカル変数にアクセスし続けることができる。

このようにメソッドが生成されたときのコンテキスト(変数情報など)を保持しているメソッドのことをクロージャ(関数閉包)という。

0
ABOUT ME
chopes
前職では、人材業界で法人営業・キャリアアドバイザー・大阪責任者をしていました。他にも、新入社員の研修策定と育成、面談者の集客におけるスカウト業務や中途採用の面接官、新卒採用の2次選考官、インターンシップのメンターとしてプログラムに参加していました。退職後は、未経験でエンジニアになるためにスクールに通学して勉強。2ヶ月の転職活動を経て、今春からRailsエンジニアとして第二のキャリアを歩むことになりました。主に学習記録や未経験エンジニアについてアウトプットしていきたいと思います! 以下、Twitterアカウントですので、気軽にフォローしてください! Twitter:@chopesu_se