From: Mark Hubbart Date: 2004-09-09T01:34:45+09:00 Subject: Re: Creating new scope On Sep 8, 2004, at 2:00 AM, Olivier D. wrote: > On 2004-09-08, George Moschovitis > wrote: >> >> x = 0 >> >> 1.times { >> x = 1 >> puts x >> } >> >> puts x >> >> prints: >> 1 >> 0 > > If I do this on my machine, it prints 1 and 1. > > What version of Ruby have you installed? I have the version 1.8.1 > and it works as advertised in the book "Programming Ruby" (chapter > "The Ruby Language"): > "If instead a variable of the same name is already established at the > time the block executes, the block will inherit this variable." > > Your 1.times block inherits the x variable and modifies it (or maybe > it's time for me to compile Ruby version 1.8.2?) Currently, creating the variable beforehand *ensures* that it will be inherited into the block. So, currently, this code snippet should print 1 and 1. I tested it on a 1.9 snapshot ( a few months old, granted), and the old 1.6.7 that's installed on one of my machines, and they both print 1 and 1. IIUC, in the future, *all* variables will leak out, except those in argument lists. So still, that wouldn't change the behavior of this code snippet. In the future, I believe you will be able to get this effect this way: x = 0 1.times do |x| x = 23 puts x #=> prints "23" end puts x #=> prints "0" If I am wrong, someone please correct me :) cheers, Mark > -- > Olivier D.