Project

General

Profile

Bug #11074

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

~~~ruby ~~~ 
 def bar 
    yield 
 end 
 x = 3 
 bar do |x=x| 
   x 
 end 
 => nil 
 bar do |y=x| 
   x 
 end 
 => 3 
 ~~~ 
 So perhaps `x=x` x=x isn't able to distinguish that the RHS should probably be the closure `x` x and, instead, is take to mean the value of the (new and uninitialized) `x` x parameter of the block. But then: 

 ~~~ruby ~~~ 
 def foo(x=x) 
    x 
 end 
 foo(3) 
 => 3 
 foo 
 => NameError: undefined local variable or method `x' for main:Object 
 ~~~ 
 So at least in this case, it knows that `x` x on the RHS isn't the parameter variable `x`. x. This seems a bit inconsistent. 

 One can get some really odd results as well: 

 ~~~ruby ~~~ 
 def foo(x) 
    bar do |x=x| 
       x 
    end 
 end 
 foo(1) 
 => 491 
 foo(1) 
 => 498 
 foo(1) 
 => 505 
 ~~~ 
 In this case, `x=x` x=x doesn't render nil as in the previous case. The value of x being returned always increases by 7. Is doing something like `x=x` x=x as a parameter (to a block) generally viewed as being "undefined" behaviour? 

 Thanks, 
 Charlton 

Back