Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Creating new scope

Reply
Thread Tools

Creating new scope

 
 
George Moschovitis
Guest
Posts: n/a
 
      09-08-2004
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!

 
Reply With Quote
 
 
 
 
Olivier D.
Guest
Posts: n/a
 
      09-08-2004
On 2004-09-08, George Moschovitis <(E-Mail Removed)> 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?)

--
Olivier D.
 
Reply With Quote
 
 
 
 
Mark Hubbart
Guest
Posts: n/a
 
      09-08-2004

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

> On 2004-09-08, George Moschovitis <(E-Mail Removed)>
> 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.




 
Reply With Quote
 
Florian Gross
Guest
Posts: n/a
 
      09-08-2004
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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: Lexical scope vs. dynamic scope Xah Lee Java 0 02-26-2009 10:08 AM
CSPEC issue: lossing scope (or incorrect scope) in cspec subroutine. balldarrens@gmail.com Perl Misc 0 02-05-2009 08:42 PM
Scope - do I need two identical classes, each with different scope? ann Java 13 09-13-2005 03:07 AM
How do namespace scope and class scope differ? Steven T. Hatton C++ 9 07-19-2005 06:07 PM
IMPORT STATIC; Why is "import static" file scope? Why not class scope? Paul Opal Java 12 10-10-2004 11:01 PM



Advertisments