ブロック、Proc.new, proc, lambda

1.8からこうなっているらしい。今日初めて知った。

Proc.new およびブロック引数で与えられる Proc は 引数チェックがゆるい。break が例外になる。
lambda および proc が返す Proc は引数チェックが厳しい。 break は実行を中断する。
(プログラミング言語 Ruby リファレンスマニュアル)

これは関数オブジェクト*1の話題で、「引数チェックがゆるい」って言うのは、

  • その関数オブジェクトにとって実引数の数が仮引数の数より少なければ、足りない分の仮引数にnilが入る。
  • その関数オブジェクトにとって実引数の数が仮引数の数より多ければ、溢れた実引数は無視される。

となること。

>> f = Proc.new {|a, b|  p( [a, b] ) }         # 仮引数2個
=> #<Proc:0x40207264@(irb):7>
>> f.call(1, 2)                                          # 実引数2個
[1, 2]
=> nil
>> f.call(1)                                              # 実引数1個
[1, nil]
=> nil
>> f.call(1, 2, 3)                                      # 実引数3個
[1, 2]
=> nil

callメソッドは、名前の通り関数オブジェクトの呼出し(関数呼び出し)。

*1:普段、関数やメソッドを定義するときに使うものではありません。