【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入門記事はこちら

    【Ruby入門】Rubyとは何か?学習方法や将来性まで考えました!

    【Ruby入門】Ruby on Railsをやってみよう!

    【Ruby入門】環境構築(Mac/Win)

    【Ruby入門】nokogiriでスクレイピング

    【Ruby入門】データベース

    【Ruby入門】gemとライブラリ

    【Ruby入門】エラーと例外処理

    【Ruby入門】モジュール(module)とMix-in

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

    【Ruby入門】ブロック

    【Ruby入門】メソッド

    【Ruby入門】クラスをコーディング(2) オブジェクト指向

    【Ruby入門】クラスをコーディング(1) classを作る

    【Ruby入門】クラスの継承、オーバーライド

    【Ruby入門】クラスとオブジェクト

    【Ruby入門】ディレクトリ(フォルダ)の作成、削除

    【Ruby入門】ファイルの移動、コピー、削除

    【Ruby入門】入力と出力

    【Ruby入門】Rubyの正規表現

    【Ruby入門】正規表現で置換する

    【Ruby入門】正規表現とは何か?

    【Ruby入門】文字列の結合などの操作

    【Ruby入門】CSVの基本と操作

    【Ruby入門】JSONの基本と操作

    【Ruby入門】乱数(Random)などの数値計算用クラスや端数処理

    【Ruby入門】日付の基本と操作(Time, Date)

    【Ruby入門】数値の数え上げ「upto」と四捨五入

    【Ruby入門】文字列の標準ライブラリnkfとヒアドキュメント

    【Ruby入門】数値の基本とメソッド (timesメソッド他)

    【Ruby入門】ハッシュ(hash)をeachで取り出す!その他ハッシュの応用に

    【Ruby入門】ハッシュ(hash)とシンボルの基本

    【Ruby入門】文字列の基本と表示メソッド

    【Ruby入門】Rubyの繰り返しを極める!様々な繰り返しのバリエーション

    【Ruby入門】最初はこれだけ!まずは手を動かしたい人のRuby入門

    【Ruby入門】ifとelseについて

    【Ruby入門】配列と操作(基本編)

    【Ruby入門】eachメソッドの使い方と応用例


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

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

    ポテパンフリーランス

    ポテパンフリーランス

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

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。

    ポテパンキャンプ

    ポテパンキャンプ

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



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

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

    この記事をシェア

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

    関連ワード

    pickup









    ABOUT US

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

    READ MORE