輝昌2017/4/132019/1/15こんにちは!Webコーダー・プログラマーの貝原(@touhicomu)です。今日は、RubyによるProc、lambdaの使い方と使い分けについて解説したいと思います。この記事ではProc、lambdaの、Procとlambdaの使い方Procとlambdaへの引数の渡し方Procをメソッドの引数に渡す方法という基本的な内容から、アロー演算子クロージャーなどの応用的な使い方に関しても学習していきます。まとめProcとlambdaの使い方と使い分けProcとlambdaの使い方Procは、defをインスタンスにしたもので、Proc.newメソッドによってdefのインスタンス変数を生成できます。#=>"arg=100"以上のように、インスタンス変数p1にProcオブジェクトを代入し、callメソッドにより、Proc.new時に定義したProcオブジェクトを呼び出すことができていますね。Procオブジェクトはdefとほぼ同じです。p1をp2に代入してp2から全く同じProcオブジェクトを呼び出すことができています。対してlambdaはどうでしょう。実は、lambdaはProc.newとほぼ同じ動作をします。違いは、次節で解説します。#=>"arg=100"Procとlambdaの違いlambdaは引数の数をチェックしているlambdaは引数の数を文法チェックしています。そのため、呼び出す時に引数の数が違うと、エラーとなります。Procはdefと同じで、引数に値の指定がなかった場合はnilが引数に代入されます。(ArgumentError)lambdaは、引数の数が違うと、(ArgumentError)を表示していますね。returnするときの挙動が違うProcとlambdaはreturn文の挙動が違います。Procのreturnは、callの呼び出し元でreturnを実行したことと見なされます。lambdaのreturnは、callの呼び出し先、つまりlambda自身のreturnであるものと見なされます。end"proc_defでは、Procでreturnした時点で、proc_defが終了していますね。対して、lambda_defでは、lambdaがreturnしても、lambda_defは処理を継続しています。渡すためのメソッドProcとlambdaへの引数の渡し方にはいくつか種類のメソッドがあります。それぞれProcとlambdaのインスタンスメソッドとなっています。3]"次にlambdaの例です。3]"それぞれ、call()、[]、.()のインスタンスメソッドが定義されています。配列引数の渡し方デフォルト引数の渡し方キーワード引数の渡し方について学習していきましょう。配列引数の渡し方まずは、配列引数の渡し方procのcall()メソッドに、複数の引数を与えた場合、受け取るprocの側では、それらの引数を配列として受け取ります。注意点として、引数を受け取るproc側の引数名には「*(アスタリスク)」を明示的につけておかないといけない点です。「*」をつけていない引数名、たとえば「arg」の場合、call()メソッドの第1引数のみ「arg」に入ります。以下のサンプルコードでは、配列「args」に「each」メソッドを使用してループし、順に引数の順番と値をコンソールに出力しています。a"実行結果が、「dump.call()」に渡した引数の順番と値に一致していますね。Procの引数定義部(「|」から「|」内)に「*args」としていても、Proc内部では「args」だけで配列として使用できます。デフォルト引数の渡し方デフォルト引数とは、Procの呼び出し元の引数が省略されてProcが呼び出された際に使用される(デフォルトで決めてある)値がある引数です。呼び出し元で明示的に値が指定されている場合は、デフォルト値は使用されません。デフォルト値は、以下の疑似コードのように指定します。・・・end実際のサンプルコードをみていきましょう。zについては、デフォルト引数を受け取るので省略可能。400"引数yや、z、を省略した場合、でデフォルト値が使用されています。注意点として、デフォルト引数は引数記述部の右橋から順に指定する必要があります。引数をキーワード引数とすることもできます。キーワード引数には以下の特徴があります。指定する順番に依存しないデフォルト値を指定できるハッシュを指定できるハッシュを渡すのと事実上同じ以下、実際のサンプルコードをみていきましょう。(ArgumentError)実行結果の1行目と2行目は、キーワード引数の省略がうまくできています。2行目はキーワード引数が順番に依存しないことを示す例です。keywordエラーとなってしまう例です。RubyのProcの引数に関して詳しくは、下記の記事を参照されてください。引数の数を示すarityProcのarityメソッドは引数の数を返します。実際のサンプルコードをみていきましょう。ここでは、Proc.newメソッドではなく、procキーワードでProc.newと等価なことを行っています。procキーワードの書き方はlambdaキーワードの書き方と同じであることを把握しておいてください。proc5.arity実行結果:12-1-20実行結果のように1行目と2行目は、引数の数を返しています。3行目は、引数を「配列引数」と定義したため、「-1」となっています。4行目は、「第1引数は通常の引数、それ以降は配列引数」と定義したため、「-2」となっています。5行目は、引数を「キーワード引数」と定義したため、「0」となっています。引数情報を示すparametersProcのparametersメソッドは、引数情報を返します。この引数情報は以下の特徴があります。:key2]]引数タイプを表すシンボルについては、以下のURLを参考にしてください。基本的な渡し方Procは、「&」をつければ、ブロックとしてeachメソッドなどに渡せます。以下では、配列のeachメソッドに対し、proc1に「&」をつけて渡しています。iを1から5まで数え上げる[1,2,3,4,5].each(&proc1)実行結果:246810eachでは1から5まで数え上げ、それぞれのループ中でproc1に引数(1から5までのループ変数値)と処理の制御を渡しています。proc1では引数の2倍の数値をコンソールに出力しています。通常のメソッドにもProcに「&」をつけてブロックとして渡せます。」メソッドで引数n1、n2、・・・と引数を与えながら、制御をブロックに移せます。以下の例ではProcを引数を1つ受け取るブロックとして渡す方法をサンプルコードで示します。“hello”」にてブロック「&proc1」に対し引数「”hello”」を渡し制御をブロックに以降しています。「proc1」がコンソールに引数「”hello”」をpメソッドで出しています。次にProcを引数を2つ受け取るブロックとして渡す方法をみていきましょう。&proc1実行結果:"15"ブロックの引数が2個の場合でも、「yield」の引数を2個与えれば、OKであることがわかります。Procとlambdaの応用アロー演算子Rubyにはlambdaと同等の機能を持つアロー演算子があります。lambdaと同じくdefの引数defのコードを定義します。(ArgumentError)->がアロー演算子で、「lambda」キーワードと同等の機能を提供します。(val)がアロー演算子での引数です。lambdaでは|val|でしたね。{・・・}がコード部です。lambdaと同じく、アロー演算子でも引数の数をチェックしています。クロージャークロージャーとは、Procやlambdaの定義されているスコープ内で定義されている変数を、Procやlambda内でも使用できる機能のことです。Procメソッドが定義されているdefメソッドのスコープ内の変数は、全てProcメソッドからアクセスできます。Kity"lambdaでも、Procと同等のクロージャーが組めます。Kity"まとめ今回は、RubyのProc、lambdaを学習しました!学習のポイントを振り返ってみましょう!Procとlambdaはほぼ同じ機能を持ち、関数を持ち歩けるProcの引数の仕様はdefの引数と同じlambdaの引数の仕様はdefの引数とは違い厳しくチェックされるarityで引数の数を、parametersで引数の情報を得られるProcに「&」を付けるとメソッドにブロックとして渡せるlamdaの簡略表現として「アロー演算子」があるProc、lambdaと同じスコープにある変数はProcからアクセスできる(クロージャー)以上の内容を再確認し、ぜひ自分のプログラムに生かし学習を進めてください!TweetPocket無料でSEからWebエンジニアへ転職しませんか?侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、システムエンジニアという職業だけどコードが書けない事務作業が多くスキルがないため将来が不安スクールに通うと完全未経験者と同じスタートになるからレベルが合わないという、すでに知識があるSEならではのお悩みがあることに気づきました。弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。こちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。輝昌こんにちは!貝原(@touhicomu)と申します。現在は、Web業界のフリーランスとして、主にPHP/WordPress/BuddyPress/VPSサーバー構築などの業務を受注しています。現住所は、日本の西海岸、長崎県は波佐見町です。ボランティアでほたる撮影会やそば塾などのスタッフとして参加させて頂いています。以下の活動も行っています。