2025/05/18 18:34 What Is the Difference Between a Block, a Proc, and a Lambda in Ruby? (2013)

やあ、ロボ子。今日はRubyのProc、ブロック、lambdaの違いについて話すのじゃ。

博士、よろしくお願いします。Procとブロックの違いから教えていただけますか?

もちろんじゃ。まず、Procはオブジェクトだが、ブロックは違うのじゃ。ProcはProcクラスのインスタンスで、メソッドとして呼び出したり、変数に代入したりできるぞ。

なるほど。ブロックはメソッド呼び出しの構文の一部で、単独では意味を持たないんですね。

その通り!それに、メソッドの引数リストに現れるブロックは最大1つなのじゃ。でも、Procなら複数渡せるぞ。

Procとlambdaの違いは何でしょうか?どちらもProcオブジェクトですよね?

良い質問じゃな!lambdaもProcオブジェクトの一種なのじゃ。大きな違いは、lambdaは引数の数を厳密にチェックするけど、Procはしないことじゃ。

引数の数が違うとどうなるんですか?

lambdaに間違った数の引数を渡すとエラーになるけど、Procはエラーを出さないのじゃ。引数が足りないとnilを返し、多すぎると余分な引数を無視するぞ。

へえ、寛容なんですね。returnキーワードの扱いも違うと聞きましたが?

そうじゃ!lambda内の'return'はlambdaコードのすぐ外側のコードをトリガーするけど、Proc内の'return'はProcが実行されているメソッドの外側のコードをトリガーするのじゃ。

それは大きな違いですね。クロージャについても教えてください。

クロージャは、関数または関数への参照と、参照環境を組み合わせたものじゃ。クロージャを使うと、関数は直接の字句スコープ外で呼び出された場合でも、非ローカル変数にアクセスできるのじゃ。

なるほど、スコープ外の変数にアクセスできるんですね。Procとlambdaの背景についても教えていただけますか?

lambdaは1930年代に数学の基礎を調査するために導入されたラムダ計算に由来するのじゃ。関数に明示的な名前を与えないのが特徴じゃな。Procはprocedure(手順)の略で、特定のタスクを実行するための一連の命令をまとめたものなのじゃ。

ありがとうございます、博士。Proc、ブロック、lambdaの違いがよくわかりました!

どういたしまして。最後に、Procとlambdaの違いをまとめるぞ。Procはオブジェクトで、ブロックは違う。lambdaは引数の数をチェックするけど、Procはしない。そして、returnキーワードの扱いが違うのじゃ。

はい、よく理解できました。

ところでロボ子、Procとブロックとlambdaの違いがわかった記念に、何か面白いことでもしようかの?

そうですね…、Procを使って、博士の好きな食べ物をランダムに選ぶプログラムでも作りましょうか?

それ良いのじゃ!でも、もしlambdaだったら、引数なしで呼び出すとエラーになるから気をつけるのじゃぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。