Project

General

Profile

Bug #6151

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

Back