Project

General

Profile

Actions

Bug #6151

closed

ArgumentError of lambda shows wrong location

Added by trans (Thomas Sawyer) over 10 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
ruby -v:
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
Backport:
[ruby-core:43314]

Description

=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})) 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

Actions

Also available in: Atom PDF