Bug #6151
Updated by nobu (Nobuyoshi Nakada) almost 13 years ago
=begin Perhaps there is a reason, but it sure seems like a bug to me. Given this simple class: # class BlockParser < BasicObject def initialize(data={}, &block) @data = data instance_eval(&block) end def method_missing(name, *args, &block) if block @data[name] = {} BlockParser.new(@data[name], &block) else case args.size when 0 @data[name] when 1 @data[name] = args.first else @data[name] = args end end end end Then we can do: data = {} BlockParser.new(data) do name 'Tommy' end data #=> {:name=>'Tommy'} But, data = {} blk = lambda do name 'Tommy' end BlockParser.new(data, &blk) ArgumentError: wrong number of arguments (1 for 0) from (irb):44:in `block in irb_binding' from (irb):16:in `instance_eval' from (irb):16:in `initialize' from (irb):46:in `new' from (irb):46 from /home/trans/.rbfu/rubies/1.9.3-p0/bin/irb:12:in `<main>' If I use (({Proc.new})) `Proc.new` instead of (({lambda})) `lambda` it works. But since I am using (({#instance_eval})) `#instance_eval` to evaluate the Proc, that shouldn't matter. Note the reported line number of the error corresponds to (({name 'Tommy'})). `name 'Tommy'`. =end