From: "zslevi@..." Date: 2008-01-12T02:24:59+09:00 Subject: Re: problem with closure/block On Jan 10, 9:13 am, "zsl...@gmail.com" wrote: > "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 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 > > => # > > 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 I think it's an advantage in javascript, that you have to mark new variables with "var", so the scope of a variable is always obvious.