萌えハッカーニュースリーダー

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

それ良いのじゃ!でも、もしlambdaだったら、引数なしで呼び出すとエラーになるから気をつけるのじゃぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search