Bug #6151
Updated by nobu (Nobuyoshi Nakada) over 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