From: "TylerRick (Tyler Rick)" Date: 2013-03-06T02:49:56+09:00 Subject: [ruby-core:53152] [ruby-trunk - Bug #6151] ArgumentError of lambda shows wrong location Issue #6151 has been updated by TylerRick (Tyler Rick). I agree, @trans, this is a very surprising behavior. I was expecting instance_eval to call the block I passed to it without any args. Since self is already implicitly available from the block, I just don't understand why instance_eval would yield self as an argument. Fortunately, I think instance_exec does what we are wanting so I'm using it instead. We should update the documentation. http://ruby-doc.org/core-2.0/BasicObject.html#method-i-instance_eval does not mention that it yields self as the first argument. ---------------------------------------- Bug #6151: ArgumentError of lambda shows wrong location https://bugs.ruby-lang.org/issues/6151#change-37314 Author: trans (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/