Creating new scope

Hello everyone,

I found the following ruby idiom in "The Ruby Way":

x = 0

1.times {
x = 1
puts x
}

puts x

prints:
1
0

essentialy this trick creates a new scope. Is there a more elegant
way to do it?
George Moschovitis

ps: The Ruby Way is a very nice book!

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?)

···

On 2004-09-08, George Moschovitis <george.moschovitis@gmail.com> wrote:

x = 0

1.times {
x = 1
puts x
}

puts x

prints:
1
0

--
Olivier D.

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 :slight_smile:

cheers,
Mark

···

On Sep 8, 2004, at 2:00 AM, Olivier D. wrote:

On 2004-09-08, George Moschovitis <george.moschovitis@gmail.com> > wrote:

--
Olivier D.

Mark Hubbart wrote:

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:

I think there's also going to be a local-method. Like this:

x = 1
local do |x|
   x = 23
   p x # => 23
end
p x # => 1

cheers,
Mark

Regards,
Florian Gross

Is there something i can do now?

George Moschovitis ha scritto:

Is there something i can do now?

maybe try another ruby binary?