Actions
Bug #12104
closedProcs keyword arguments affect value of previous argument
    Bug #12104:
    Procs keyword arguments affect value of previous argument
  
Description
This seems like a bug to me:
2.3.0 :001 > p = Proc.new {|nodes, match_array: false| puts nodes.inspect }
 => #<Proc:0x007fa52c0659e0@(irb):1>
2.3.0 :002 > p.call([])
nil
 => nil
2.3.0 :003 >  p.call([], match_array: true)
[]
 => nil
When I try the same thing in a method I get the behavior I would expect:
2.3.0 :004 > def foo(nodes, match_array: false)
2.3.0 :005?>   puts nodes.inspect
2.3.0 :006?>   end
 => :foo
2.3.0 :007 > foo([])
[]
 => nil
2.3.0 :008 > foo([], match_array: true)
[]
  
        
          
          Updated by cheerfulstoic (Brian Underwood) over 9 years ago
          
          
        
        
      
      This seems to also happen when trying to use a options Hash as the second argument:
2.3.0 :009 > p = Proc.new {|nodes, options = {}| puts nodes.inspect }
 => #<Proc:0x007fa52b13b348@(irb):9>
2.3.0 :010 > p.call([])
nil
 => nil
2.3.0 :011 > p.call([], match_array: true)
[]
        
          
          Updated by cheerfulstoic (Brian Underwood) over 9 years ago
          
          
        
        
      
      Looking deeper now it seems to be that this is because the first argument is an Array and that when that happens it's interpreting that as the elements of the array being the arguments of the Proc. Is that supposed to happen?
        
          
          Updated by ko1 (Koichi Sasada) over 9 years ago
          
          
        
        
      
      - Status changed from Open to Rejected
 
You are right.
It is intentional.
        
          
          Updated by znz (Kazuhiro NISHIYAMA) over 9 years ago
          
          
        
        
      
      How about using lambda instead of Proc.new?
>> p = lambda {|nodes, match_array: false| puts nodes.inspect }
=> #<Proc:0x0000000183a0a8@(irb):1 (lambda)>
>> p.call([])
[]
=> nil
>> p = lambda {|nodes, options = {}| puts nodes.inspect }
=> #<Proc:0x00000001850c68@(irb):3 (lambda)>
>> p.call([])
[]
=> nil
        
          
          Updated by hsbt (Hiroshi SHIBATA) almost 8 years ago
          
          
        
        
      
      - Related to Feature #14183: "Real" keyword argument added
 
        
          
          Updated by marcandre (Marc-Andre Lafortune) about 7 years ago
          
          
        
        
      
      - Related to deleted (Feature #14183: "Real" keyword argument)
 
Actions