ブロック、Proc、lambdaの違い
6月2日
前提として
オブジェクトでもメソッドでも演算子でもないRubyの仕様。
リテラルの一つとも呼べる気がするのだけどどうなんだろう。 Procはブロックをオブジェクトとして扱った時のクラス。 =Procオブジェクトは、ブロックをオブジェクト化したもの。 Procクラスのイニシャライザ(Proc.new)に対してブロックを渡すと、そのブロックを元にProcオブジェクトを返す。 「ブロック」と、「Procクラスのインスタンス」の違いは後述。 呼び出し時、ブロックを渡すとProcオブジェクトを返す。 ブロックはそもそもブロックというRubyの仕様であり、他のProc(クラス)やlambda(メソッド)とはレイヤーも違う全くの別物。 ここで比べるのは、Proc.newとlambda。
Proc.newとlambdaの違い
両方ともProcオブジェクトを返すが、lambdaが返すProcオブジェクトの方がメソッドに近い挙動をする。 引数の個数
Proc.newが返すProcオブジェクトは引数の数が違っていてもエラーにならない。 lambdaが返すProcオブジェクトは、引数の数が違うとwrong number of argumentsのエラーになる。 ジャンプ構文
return
Proc.new: Procオブジェクト呼び出し元を抜ける。 next
break
Proc.new:エラー(LocalJumpError)。