レシピ2.1

RubyのlambdaとProc.newは凄くにてるけど、少し違う

同じ挙動

irb(main):012:0> square = {|x| puts x**2}
SyntaxError: compile error

irb(main):016:0* square1 = lambda {|x| puts x**2}
=> #<Proc:0x00002ab8c198d420@(irb):16>
irb(main):017:0> square1.call(2)
4
=> nil

irb(main):021:0> square2 = proc {|x| puts x**2}
=> #<Proc:0x00002ab8c1965380@(irb):21>
irb(main):022:0> square2.call(2)
4
=> nil

irb(main):023:0> square3 = Proc.new {|x| puts x**2}
=> #<Proc:0x00002ab8c0f791a0@(irb):23>
irb(main):024:0> square3.call(2)
4
=> nil

違う挙動

irb(main):030:0> add1 = lambda {|x,y| x+y}
=> #<Proc:0x00002ab8c19b8cb0@(irb):30>
irb(main):031:0> add2 = Proc.new {|x,y| x+y}
=> #<Proc:0x00002ab8c19ac230@(irb):31>
irb(main):032:0>
irb(main):033:0* add1.call(1,2)
=> 3
irb(main):035:0> add2.call(1,2)
=> 3
irb(main):036:0> add1.call(1)
ArgumentError: wrong number of arguments (1 for 2)
        from (irb):30
        from (irb):36:in `call'
        from (irb):36
        from :0
irb(main):037:0> add2.call(1)
TypeError: nil can't be coerced into Fixnum
        from (irb):31:in `+'
        from (irb):31
        from (irb):37:in `call'
        from (irb):37
        from :0
irb(main):038:0> add2.call(1,2,3)
=> 3

lambdaで生成されたブロックはメソッドのように機能し、正しい数のブロック引数が必要
それに対し、Prock.newで生成されたブロックはEnumerable#eachなどのメソッドに渡す匿名コードブロックのように機能し、余分な引数は無視され、足りない引数はnilとして扱われる

Rubyクックブック ―エキスパートのための応用レシピ集

Rubyクックブック ―エキスパートのための応用レシピ集