Creating new scope

  • Thread starter George Moschovitis
  • Start date
G

George Moschovitis

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!
 
O

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

Mark Hubbart

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

 
F

Florian Gross

Mark said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top