From: John Firebaugh Date: 2012-03-16T12:42:14+09:00 Subject: [ruby-core:43323] [ruby-trunk - Bug #6151] ArgumentError of lambda shows wrong location Issue #6151 has been updated by John Firebaugh. The reason it raises an error is that instance_eval yields one argument (the receiver), and lambdas are strict about arity -- see #2476. ---------------------------------------- Bug #6151: ArgumentError of lambda shows wrong location https://bugs.ruby-lang.org/issues/6151#change-24627 Author: Thomas Sawyer Status: Closed Priority: Normal Assignee: Category: core Target version: 2.0.0 ruby -v: ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux] =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 `
' If I use (({Proc.new})) instead of (({lambda})) it works. But since I am using (({#instance_eval})) to evaluate the Proc, that shouldn't matter. Note the reported line number of the error corresponds to (({name 'Tommy'})). =end -- http://bugs.ruby-lang.org/