"Blocks in Ruby are closures, so they save the context in which they were created, but new variables inside the closure are local. " I just expected, that if the head of the closure has x, it will create a new local variable with the same name. On Jan 10, 2:33 am, Justin Collins <justincoll... / ucla.edu> wrote: > levili... / gmail.com wrote: > > ########################### > > y=5 > > print "y: " + y.to_s + "\n" > > text_at_the_end = lambda do |y| > > print y + " text at the end\n" > > end > > > print "y: " + y.to_s + "\n" > > > def oneparam > > yield("oneparam") > > end > > > oneparam(&text_at_the_end) > > print "y: " + y + "\n" > > > ######################## > > It gives the following output: > > > y: 5 > > y: 5 > > oneparam text at the end > > y: oneparam > > > Is this a bug? Shouldn't "y" be in a local scope in "text_at_the_end"? > > I just downloadad Ruby yesterday: > > > Ruby Version 1.8.6 > > Installer Version 186-2 > > Blocks in Ruby are closures, so they save the context in which they were > created, but new variables inside the closure are local. > > irb(main):001:0> x = 1 > => 1 > irb(main):002:0> l = lambda do |y| > irb(main):003:1* puts x > irb(main):004:1> puts y > irb(main):005:1> end > => #<Proc:0x00002ae970650e58@(irb):2> > irb(main):006:0> l['hello'] > 1 > hello > => nil > irb(main):007:0> y > NameError: undefined local variable or method `y' for main:Object > from (irb):7 > from :0 > irb(main):008:0> x > => 1 > irb(main):009:0> x += 1 > => 2 > irb(main):010:0> l['again'] > 2 > again > => nil > > Take a look here:http://ruby-doc.org/docs/ProgrammingRuby/html/tut_containers.html#UG > > -Justin