Forum: Ruby Question about variable scope

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
robin (Guest)
on 2007-01-27 19:56
(Received via mailing list)
Does the following code behave as you'd expect?

  2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}

Can you explain why j is nil rather than 0, the second time round?

Thanks,
Robin
Thomas H. (Guest)
on 2007-01-27 20:36
(Received via mailing list)
"robin" <removed_email_address@domain.invalid> wrote/schrieb
<removed_email_address@domain.invalid>:

>   2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}
>
> Can you explain why j is nil rather than 0, the second time round?

I'll try. Everytime the block is executed, new variables n, i and j
are created, because they don't already exist outside the block. If
you want i to be shared, it should already exist before, e.g.:

  i = nil
  2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}

Regards
  Thomas
Robert D. (Guest)
on 2007-01-27 21:27
(Received via mailing list)
On 1/27/07, Thomas H. <removed_email_address@domain.invalid> wrote:
> you want i to be shared, it should already exist before, e.g.:
>
>   i = nil
>   2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}


maybe OP thought that
i,j = n,i
is semantically equivalent to
i=n
j=i
but it is not :(, which is good :)
the assignments are performed in parallel, and i is still nil when
assigned
to j.
But this is very useful thus one can e.g. swap
the value of two variables as follows

a,b = b,a

HTH
Robert
robin (Guest)
on 2007-01-28 02:05
(Received via mailing list)
On Jan 27, 6:24 pm, Thomas H. <removed_email_address@domain.invalid> wrote:
> I'll try. Everytime the block is executed, new variables n, i and j
> are created, because they don't already exist outside the block. If
> you want i to be shared, it should already exist before, e.g.:
>
>   i = nil
>   2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}

Thanks for the reply. I think I've succeeded in adjusting my mental
model enough that this now makes sense. :-)

Robin
This topic is locked and can not be replied to.