レシピ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として扱われる
- 作者: Lucas Carlson,Leonard Richardson,株式会社クイープ
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/04/27
- メディア: 大型本
- 購入: 1人 クリック: 73回
- この商品を含むブログ (55件) を見る