【Ruby入門】Procクラスとラムダ(lambda)
  • facebookページ
  • twitterページ
  • 2017.12.19

    【Ruby入門】Procクラスとラムダ(lambda)

    前記事「【Ruby入門】ブロック」では、ブロックの基本を解説しました。

    ブロックとは、処理そのものを部分的にまとめ、投げることができるものでしたよね?

    ブロックが理解できたなら、さらに先に進みましょう!

    本記事ではProcクラスの使い方や、ラムダ(lambda)まで解説します。

    本記事を読み終えると、ブロックやラムダ式、クラスを効率的に使いこなすことができますよ!

    ブロックとProcクラス

    ブロックとは一連の手続きをまとめて投げるもの、と解説しました。

    投げるだけでなく、さらに応用が利くようにできるのです。

    そのときに使うのがProcクラスです。

    Procクラスの使い方

    まずコードから。

    呼び出すときはこうします。

    [実行結果]

    何が起こったのかというと、sayhelloという名前で、受け取った引数をputsで表示する「手続き」を持つオブジェクトができたのです。

    sayhelloという名前の、Procオブジェクトにある手続きを呼ぶのがcallです。

    callはProcクラスがもとから持っているメソッドなので、私たちはそれについて考える必要はありません。

    Procオブジェクトを作るときに、do〜endで囲われたブロックを渡しています。

    作ったオブジェクトの中の手続きを呼び出すときの引数がブロック引数となります。

    総合すると、先ほどのプログラムはこうなります。

     

    • sayhelloという名前で、Procオブジェクトを作成
    • そのオブジェクトにブロックを設定
    • 手続きが呼ばれた(つまりcallされた)ときに引数を受け取る。
    • 受け取った引数はブロック引数としてブロックに渡る。
    • ブロックの中身は引数をputsする処理

     

    そして最後に「sayhello.call(“potepan”)」として結果を受け取ったというわけです。

    オブジェクトというと、どうしても変数やメソッドを格納するというイメージがあります。

    ここでちょっとパラダイムシフトして、手続きを持つオブジェクト、という理解をしてください。

    難しいけど、そのうちハッと気づくときがきっと来ます。

    また、呼び出すときはcallメソッドの他に、[]で書く方法もあります。

    引数はハッキリ決まってなくとも良い

    引数の数が仕様上決まらないときは、ブロック変数を「|*配列|」の形式にして配列で受け取ることができます。

    [実行結果]

    今のところは3つですが、増減しても問題なく動作します。

    ラムダ(lambda)

    ラムダ(lambda)も手続きを持つオブジェクトを作成できますが、Proc.newと比較して何点か異なる性質があります。

    順に解説していきます。

    ラムダとは何か

    Ruby以外の言語でも、ラムダは普通にあります。ただし、ラムダ式と「式」が付きます。

    いずれにしても、手続きを持って運ぶという意味は変わりません。

    Procオブジェクトを作る手段をProc.newとラムダのいずれを使うか、という感じです。

    ラムダの使い方

    ラムダとProc.newのちがいを見ていきましょう。

    ちがいに注目するので、内容は超簡単なものにしました。

    [実行結果]

    Proc.newをラムダに置き換えただけですね。

    復習のために、Proc.newバージョンも見ておきましょう。

    実行結果は同じです。

    ラムダとProc.newの比較

    前章で、ちがいは書き方くらいかなと思われたでしょうか?

    ではなぜ2つ存在しているのか、2つのちがいは何か、というのを解説します。

    引数の数が厳密になる

    引数の数が厳密になります。Proc.newは数が異なっていてもエラーになりません

    [実行結果]

    数が合わないなりに、なんとか動きます。

    一方ラムダではそうはいきません。

    [実行結果]

    引数の数が、本来は3なのに2個しか来てない!と怒られてしまいました。

    ただし配列にすれば問題ありません。

    [実行結果]

    returnが使える

    ブロックから値を返すときに、returnを使ったときの挙動が異なります。

    まずはラムダからです。

    [実行結果]

    次に、Proc.newです。

    [実行結果]

    若干強引な解説をします。

    ラムダの場合、returnしたところでブロックはまだ生き残ったままです。

    よって、「morning = sample4(“おはよう!”)」を終えてもまだ生きているために、次の「p morning.call(“honda”)」に来ても実行可能です。

    ところがProc.newの場合はそうではありません。

    returnした段階でオブジェクトが消えてしまい、次の「p morning.call(“honda”)」ではすでにブロックは消滅した後です。

    よって、すでに消滅してしまったmoriningに対してcallを実行しようとしてエラーになったというわけです。

    まとめ

    本記事ではブロック、とりわけlambdaとProcについて解説しました。

    両者をうまく使い分けて、効率的なプログラミングができるようになってくださいね!


    Ruby on Railsのフリーランスは高収入でおすすめ!

    Rubyができる方は多くはいないのが現状です。 プロジェクトは右肩上がりで増えているので、エンジニアが全く足りておりません。 Rubyの実務経験が1年以上ある方はフリーランスになることもできるので、ぜひご興味があればポテパンの無料カウンセリングをご利用下さいませ! Ruby案件に関する情報は下記にまとまっていますのでぜひご覧下さい。

    Ruby on Rails案件のイマがわかる!知って見つかる最適案件


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!フリーエンジニアになりたい方向けのコンテンツも盛りだくさんです。

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。年収800円以上のハイスペック転職をご希望の方は「ポテパンプロフェッショナル」もご用意しておりますのでご利用下さいませ。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料10万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテキャンバナー ポテキャリバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE